Little-Endian 시스템에서 데이터를 네트워크 순서로 변환하기 위해 어떤 변환이 사용됩니까?

StackOverflow https://stackoverflow.com/questions/463416

문제

Little-Endian 시스템의 데이터를 네트워크 바이트 순서로 변환하는 데 필요한 기본 변환은 무엇입니까? 2 바이트 및 4 바이트 데이터의 경우 변경 사항을 캡슐화하는 잘 알려진 기능 (예 : HTON, NTOHL 등)이 있습니다. 1 바이트 데이터의 문자열은 어떻게됩니까?

또한 Wikipedia는 Little-Endian이 Big-Endian의 거울 이미지임을 암시하지만, 그것이 사실이라면 왜 2 및 4 바이트 데이터에 대한 특정 처리가 필요합니까?

"거룩한 전쟁에 대한 에세이와 평화를위한 탄원"에세이는 리틀 엔디언의 여러 가지 맛이 있다는 것을 암시하는 것 같습니다. 오래된 에세이입니다. 여전히 적용됩니까? Java 클래스 파일의 시작 부분에서 발견 된 것과 같은 바이트 주문 마커는 여전히 필요합니까?

마지막으로 네트워크 바이트 주문에 4 바이트 정렬이 필요합니까?

도움이 되었습니까?

해결책

배열에 ASCII 텍스트 "bige"가 있다고 가정 해 봅시다. b 바이트의.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

이것은 문자열의 네트워크 순서이기도합니다.

32 비트 정수로 취급 된 경우

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

작은 엔디 언 플랫폼에서

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

큰 엔디 어 플랫폼에서.

각 16 비트 작업을 개별적으로 변환하면이 중 어느 것도 얻을 수 없습니다.

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

그것 때문에 ntohl 그리고 ntohs 둘 다 필요합니다.

다시 말해, ntohs 16 비트 짧은 내에 바이트를 바꾸고 ntohl 32 비트 단어의 4 바이트의 순서를 뒤집습니다.

다른 팁

2 및 4 바이트 데이터에 대한 특정 처리 기능은 특정 데이터 크기에서 작동하는 프로세서 지침이 있다는 사실을 활용합니다. 1 바이트 역 기능을 4 번 실행하는 것은 한 번에 4 바이트 모두에서 동일한 (규모가 증가했지만) 작업을 수행하기 위해 더 넓은 지침을 사용하는 것보다 확실히 덜 효율적입니다.

1 바이트 데이터는 Endians 간의 변환이 필요하지 않습니다 (String Encoding의 UTF-1 및 UTF-32에 대한 UTF-8의 이점).

네트워크 바이트 주문에 4 바이트 정렬이 필요합니까?

네트워크를 통해 바이트를 사용하려면 구체적인 정렬이 필요하지 않습니다. 프로세서는 메모리에 특정 정렬을 요구할 수 있지만 불일치를 해결하는 것은 귀하에게 달려 있습니다. X86 가족은 일반적으로 그러한 요구를하지 않습니다.

기본 아이디어는 모든 다중 바이트 유형이 바이트의 순서를 취소해야한다는 것입니다. 4 바이트 정수에는 바이트 0과 3이 교환되고 바이트 1과 2는 교환됩니다. 2 바이트 정수에는 바이트 0과 1이 교환됩니다. 하나의 바이트 문자는 교환되지 않습니다.

두 가지가있다 매우 중요 비 연습 자와 초보자가 항상 깨닫지 못한다는 것의 의미는 다음과 같습니다.

  1. (ASCII) 문자열은 닿지 않습니다.
  2. 거기 있습니다 아니요 바이트에 대한 맹인 알고리즘이 제네릭 "데이터"를 바꾸는 것입니다. 모든 데이터의 유형을 알고 각 항목을 유형에 필요한 방식으로 교체해야합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top