> 백엔드 개발 > C++ > C에서 64비트 정수를 네트워크 바이트 순서로 변환할 때 이식성을 달성하는 방법은 무엇입니까?

C에서 64비트 정수를 네트워크 바이트 순서로 변환할 때 이식성을 달성하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-30 04:37:28
원래의
931명이 탐색했습니다.

How to Achieve Portability When Converting 64-Bit Integers to Network Byte Order in C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿