C에서 64비트 정수의 네트워크 바이트 순서 변환에 대한 이식성 문제
C에서는 64비트 정수를 변환해야 할 필요성이 발생합니다. Memcache 프로토콜 구현과 같은 특정 애플리케이션에 대한 "네트워크 바이트 순서"입니다. 32비트 정수를 변환하는 htonl() 함수가 있음에도 불구하고 64비트 정수에 대한 유사한 함수(htonll())는 여전히 파악하기 어렵습니다.
표준 함수 고려 사항
안타깝게도 현재 C에는 64비트 네트워크 바이트 순서 변환을 수행할 수 있는 이식 가능한 표준 함수가 없습니다. 이러한 부재로 인해 사용자 정의 구현이 필요합니다.
사용자 정의 구현
htonll()을 구현하려면 먼저 시스템의 엔디안을 결정해야 합니다. 신뢰할 수 있는 한 가지 방법은 런타임에 알려진 바이트 순서(예: 42)를 사용하여 정수 변수의 값을 평가하는 것입니다.
<code class="cpp">static const int num = 42; bool isBigEndian = (*reinterpret_cast<const char *>(&num) == num);</code>
다음으로 엔디안에 따라 변환을 수행할 수 있습니다.
<code class="cpp">uint64_t htonll(uint64_t value) { if (isBigEndian) { const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32)); const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL)); return (static_cast<uint64_t>(low_part) << 32) | high_part; } else { return value; } }
이식성을 위한 매크로
또는 매크로는 htonll() 및 그에 상응하는 ntohll()을 정의하는 간결한 방법을 제공할 수 있습니다.
<code class="cpp">#define htonll(x) ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) #define ntohll(x) ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>
이러한 매크로는 필요한 바이트 교환을 결정하기 위해 시스템의 고유한 바이트 순서 지정 동작에 의존합니다.
컴파일러 관련 매크로
일부 컴파일러와 운영 체제는 엔디안을 결정하기 위한 특정 매크로를 제공합니다. . 예를 들어 이를 지원하는 시스템에서 다음을 사용할 수 있습니다.
<code class="cpp">#if __BIG_ENDIAN__ # define htonll(x) (x) # define ntohll(x) (x) #else # define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) # define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32)) #endif</code>
이러한 기술을 사용하면 htonll() 및 ntohll()의 사용자 정의 구현을 다양한 시스템과 컴파일러에 걸쳐 이식할 수 있습니다.
위 내용은 C에서 64비트 정수를 네트워크 바이트 순서로 변환할 때 이식성을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!