문제
나는 특별한 서명되지 않은 긴 길이 (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;
}
정수의 비트 순서를 뒤집으려면 비트를 한 방향으로 바꾸고 비트를 반대 방향으로 대상으로 바꿀 수 있습니다.