>  기사  >  백엔드 개발  >  C에서 64비트 htonll 함수를 구현하는 방법은 무엇입니까?

C에서 64비트 htonll 함수를 구현하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-31 04:21:45486검색

How to Implement a 64-Bit htonll Function in C  ?

C에서 "표준" 64비트 htonl 함수 검색

C에서 htonl 함수는 32-비트를 변환하는 데 사용됩니다. 호스트 바이트 순서에서 네트워크 바이트 순서까지의 비트 정수입니다. 그러나 64비트 정수의 경우 현재 해당 언어에서 사용할 수 있는 "표준" htonll 함수가 없습니다.

htonll의 이식 가능한 구현

이러한 요구를 해결하려면 프로그래머 Windows, Linux 및 AIX를 포함한 다양한 플랫폼에서 64비트 정수 바이트 순서 변환을 처리하기 위해 htonll의 이식 가능한 구현을 고안했습니다. 이러한 구현 중 하나는 다음과 같습니다.

<code class="cpp">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) &amp; 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>

이 구현은 32비트 변환에 htonl 함수를 사용하고 64비트 정수의 각 32비트 절반에 대해 한 번씩 두 번 적용합니다. 부품의 순서가 올바른지 확인합니다.

엔디안 결정

C에는 컴파일 타임에 엔디안을 결정하는 이식 가능한 방법이 없기 때문에 위의 구현에서는 호출을 통해 런타임에 엔디안을 확인합니다. htonl은 정수 1입니다. 결과가 1이면 시스템은 리틀 엔디안이며 바이트 교환이 필요하지 않습니다. 그렇지 않은 경우에는 빅엔디안이며 구현에서는 바이트를 교환합니다.

컴파일러 지시문을 사용하는 대안

또 다른 이식 가능한 구현에서는 컴파일러 지시문을 사용하여 빅엔디안과 빅엔디안을 구별합니다. little-endian 아키텍처:

<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>

이 구현은 대부분의 컴파일러와 운영 체제에서 지원되는 BIG_ENDIAN 지시어를 기반으로 htonll 및 ntohll 함수를 정의합니다.

위 내용은 C에서 64비트 htonll 함수를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.