>  기사  >  백엔드 개발  >  C에서 네트워크와 호스트 바이트 순서 사이의 64비트 값을 변환하는 방법은 무엇입니까?

C에서 네트워크와 호스트 바이트 순서 사이의 64비트 값을 변환하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 04:42:30741검색

How to Convert 64-bit Values Between Network and Host Byte Order in C  ?

64비트 값을 위한 ntohl() 확장

C 함수 ntohl()은 일반적으로 네트워크에서 32비트 값을 변환하는 데 사용됩니다. 호스트 바이트 순서에 대한 바이트 순서입니다. 그러나 특정 시나리오에서는 64비트 값에 대해 유사한 작업이 필요할 수 있습니다.

솔루션

htonl()의 매뉴얼 페이지에는 32-비트로 제한됨이 나와 있습니다. 특정 플랫폼에서는 unsigned long의 크기가 32비트이므로 비트 값입니다. 64비트 변환의 ​​필요성을 해결하기 위해 여러 가지 접근 방식을 탐색할 수 있습니다.

표준 라이브러리:

  • htobe64() 및 be64toh() : 이러한 함수는 Linux(glibc >= 2.9) 및 FreeBSD에서 빅 엔디안과 리틀 엔디안 사이의 64비트 값을 변환하는 데 사용할 수 있습니다.

구현 제안:

  • unsigned long long 및 char을 사용한 유니온[8]: 플랫폼이 빅 엔디안이 아닌 경우 유니온을 사용하여 바이트를 수동으로 교환할 수 있습니다. 그러나 이 방법은 시스템 의존적 가정에 의존하므로 권장되지 않습니다.

전처리기 매직:

  • 플랫폼별 헤더 : 다음 전처리기 코드는 Linux, FreeBSD, OpenBSD를 포함한 다양한 플랫폼 간 이식성을 허용합니다.
<code class="cpp">#if defined(__linux__)
#  include <endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__)
#  include <sys/endian.h>
#elif defined(__OpenBSD__)
#  include <sys/types.h>
#  define be16toh(x) betoh16(x)
#  define be32toh(x) betoh32(x)
#  define be64toh(x) betoh64(x)
#endif</code>

사용 예:

전처리기 매직을 사용하면 다음 코드 조각을 사용하여 변환을 수행할 수 있습니다.

<code class="cpp">  #include <stdint.h>

  uint64_t  host_int = 123;
  uint64_t  big_endian;

  big_endian = htobe64( host_int );
  host_int = be64toh( big_endian );</code>

이 접근 방식은 여러 플랫폼에서 호환되는 표준 C 라이브러리와 유사한 인터페이스를 제공합니다.

위 내용은 C에서 네트워크와 호스트 바이트 순서 사이의 64비트 값을 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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