문제

나는 특별한 서명되지 않은 긴 길이 (32 비트)를 가지고 있으며 비트의 엔지니어를 조금씩 변환해야합니다. 내 긴은 모두 함께 뭉친 몇 가지를 한 조각의 이진으로 나타냅니다.

어떻게해야하나요?

도움이 되었습니까?

해결책

Endianness는 바이트가 가장 중요하지 않은 바이트 (Big Endian) 또는 가장 중요하지 않은 바이트 (Little Endian)가 저장되는 단어 수준의 개념입니다. 네트워크를 통해 전송 된 데이터는 일반적으로 Big Endian (소위 네트워크 바이트 주문)입니다. 머신에 메모리에 저장된 데이터는 어느 순서대로있을 수 있으며, Intel X86 아키텍처의 유병률을 고려할 때 Little Endian은 가장 일반적입니다. 대부분의 컴퓨터 아키텍처는 Big Endian이지만 X86은 너무나 유비쿼터스이므로 메모리에서 Endian 데이터를 거의 볼 수 없습니다.

어쨌든, 모든 것의 요점은 Endianness가 비트 레벨이 아니라 바이트 레벨에서만 적용되는 매우 구체적인 개념이라는 것입니다. 만약에 ntohs(), ntohl(), htons(), 그리고 htonl() 당신이 원하는 것을하지 마십시오. 당신이 다루는 것은 그 자체가 아닙니다.

서명되지 않은 긴장의 개별 비트를 되돌리거나 복잡한 일을 해야하는 경우 정확히 필요한 작업에 대한 자세한 정보를 게시하십시오.

다른 팁

'엔지니어'의 의미를 이해하도록주의하십시오. 바이트 내에서 비트가 아닌 데이터 내의 바이트 순서를 나타냅니다. D- 워드를 변환하려면 HTONL 또는 NTOHL과 같은 함수 만 사용하면됩니다.

32B 데이터 유형에서 모든 비트의 순서를 진정으로 반전하려면 반복 알고리즘을 작성하여 각 비트를 적절한 반사 위치로 마스킹하고 전환 할 수 있습니다.

서명되지 않은 긴 값에 대한 간단한 Endianess 변환 함수는 다음과 같습니다.

typedef union {
  unsigned long u32;
  unsigned char u8 [ 4 ];
} U32_U8;

unsigned long SwapEndian(unsigned long u)
{
   U32_U8 source;
   U32_U8 dest;

   source.u32 = u;
   dest.u8[0] = source.u8[3];
   dest.u8[1] = source.u8[2];
   dest.u8[2] = source.u8[1];
   dest.u8[3] = source.u8[0];

   return dest.u32;
}

정수의 비트 순서를 뒤집으려면 비트를 한 방향으로 바꾸고 비트를 반대 방향으로 대상으로 바꿀 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top