programing

Java는 정수를 little endian 또는 big endian으로 읽습니까?

sourcetip 2022. 9. 12. 12:14
반응형

Java는 정수를 little endian 또는 big endian으로 읽습니까?

C 프로세스에서 Java로 바이트 스트림을 보내서 물어봅니다.C측에서 32비트 정수의 LSB는 첫 번째 바이트이고 MSB는 네 번째 바이트입니다.

그래서 질문이 있습니다.C 프로세스에서 전송된 바이트를 Java 측에서 읽었을 때 Java 측에서 endian이란 무엇입니까?

후속 질문:Java측의 endian이 송신된 endian과 다를 경우 어떻게 변환해야 합니까?

네트워크 바이트 순서(빅엔디안)를 사용합니다.이것은 Java가 사용하는 것과 동일합니다.C 의 다른 번역자에 대해서는, man hoton 를 참조해 주세요.

구글을 통해 우연히 이곳에 와서 자바가 빅 엔디안이라는 답을 얻었다.

응답을 읽어보면 바이트는 확실히 엔디안적인 순서를 가지고 있다는 것을 지적하고 싶습니다만, 다행히도 인텔, Motorola, Zilog가 UART 칩의 이동 방향에 동의했기 때문에 "메인스트림" 마이크로프로세서를 다루어 본 적이 없을 것입니다.2**7LSB는2**0(이것이 얼마나 오래된 것인지 강조하기 위해 FORTRAN 전력 표기법을 사용했습니다)

20년 이상 전에 10,000달러짜리 인터페이스 하드웨어를 Mac 컴퓨터로 교체했을 때 일부 Space Shuttle 비트 다운링크 데이터에 이 문제가 발생했습니다.오래전에 출판된 NASA Tech Brief가 있습니다.256 엘리먼트 룩업테이블을 사용하여 비트를 반전시켰습니다(table[0x01]=0x80비트 스트림에서 각 바이트가 시프트된 후 등).

Java에는 부호 없는 정수가 없습니다.모든 정수는 부호화 되어 있고 빅 엔디안으로 되어 있습니다.

C측에서 각 바이트는 시작 시 tne LSB가 왼쪽에 있고 MSB는 마지막에 있습니다.

LSB를 Lest significant bit로 사용하고 있는 것 같죠?LSB는 보통 최하위 바이트를 나타냅니다.Endianness는 비트 베이스가 아니라 바이트 베이스입니다.

부호 없는 바이트에서 Java 정수로 변환하려면:

int i = (int) b & 0xFF;

부호 없는 32비트 little-endian(바이트[])에서 Java long(테스트되지 않은 정수리부터)으로 변환하려면:

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;

Java에서는 (API가 아닌 직접) 바이트를 int에 매핑할 수 없기 때문에 이것이 Java에서는 어떤 것도 영향을 미칠 수 없습니다.

이 동작이나 이와 유사한 동작을 하는 모든 API는 매우 정확하게 정의하기 때문에 해당 API의 매뉴얼을 참조해야 합니다.

바이트를 하나씩 읽고 긴 으로 결합합니다.이렇게 하면 엔디안성을 제어할 수 있고 커뮤니케이션 프로세스가 투명해집니다.

imho는 java에 대해 정의된 엔디안성은 없습니다.endianness는 하드웨어 중 하나이지만 java는 높은 레벨로 하드웨어를 숨기고 있기 때문에 걱정할 필요가 없습니다.

유일한 endianess 관련 기능은 java lib가 int 및 long을 byte[](및 그 반대)에 매핑하는 방법입니다.가장 읽기 쉽고 자연스러운 빅 엔디안을 제공합니다.

int i=0xAABBCCDD

매핑처

byte[] b={0xAA,0xBB,0xCC,0xDD}

사용하는 프로토콜에 맞는 경우 동작이 매우 잘 정의되어 있는 DataInputStream 사용을 고려해 보십시오.

자바어즉, (최소한 인텔 CPU 상에서) 메모리를 검사하는 경우는, int 의 MSB 가 왼쪽에 있는 것을 의미합니다.자바 MSB.
Little-endian' 시스템에 의해 저장된 바이너리 파일에서 4바이트의 부호 없는 정수를 읽으려면 Java에서 약간의 적응이 필요합니다.DataInputStream readInt() Big-Endian 。
부호 값 00 00 00 00 00 00 으로 1 : の の 4 with with with ( HexEdit ) 의 01 00 00 00 00 00 00 00 00 00 00 00 로의 로의의을 을 의 의 의 의 의 의1 의1 의1 의의의의의1 with의의의1 의의의의의의의 with with with with with의의 with with with with with with의의의의의의의의의의의 with with with의

 // Declare an array of 4 shorts to hold the four unsigned bytes
 short[] tempShort = new short[4];
 for (int b = 0; b < 4; b++) {
    tempShort[b] = (short)dIStream.readUnsignedByte();           
 }
 int curVal = convToInt(tempShort);

 // Pass an array of four shorts which convert from LSB first 
 public int convToInt(short[] sb)
 {
   int answer = sb[0];
   answer += sb[1] << 8;
   answer += sb[2] << 16;
   answer += sb[3] << 24;
   return answer;        
 }

java force 정말 big endian :https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11

언급URL : https://stackoverflow.com/questions/362384/does-java-read-integers-in-little-endian-or-big-endian

반응형