2013-04-07 3 views
2

아래의 내용과 너무 혼동 스러울 때 나는 의심 스럽습니다. 그물에있는 다른 곳을 깨끗하게 처리하십시오.리틀 엔디안에서 ntohl() 대 htonl() 리틀 엔디 언

#include<stdio.h> 
int main() 
{ 
    int a = 0x44332211; 
    printf("Network - 0x%x\n", htonl(a));// Host to network 
    printf("Host - 0x%x\n", ntohl(a));// Network to host 
    return 0; 
} 

출력 :

Network - 0x11223344 
Host - 0x11223344 
여기

htonl(0x44332211) => 난 엔디안 (LE)는 BE로 변환하고있다. 출력은 0x11223344입니다. 나는 그것을 이해했다. 내 문제는 ntoh()입니다. 지금 ntohl(0x44332211) => 뭐라고 요?

여기에서는 1 개의 터미널에서 두 명령을 모두 실행하고 있습니다. 따라서 네트워크에 호스트, 즉 hton()은 네트워크에 내 터미널을 의미합니다. 그건 의미가 있습니다. 하지만 여기에 ntohl() 무엇을 의미합니까? ntohl() 우리가있는 경우 그림으로 온다 :

a PC A----(ie hton)sending data over network------>(ie ntoh) to PC B? 

또한 ntoh 즉 네트워크 바이트 순서 빅 엔디안 기대하고있다. 친절하게 무엇을 ntohl() 의미 intepret 그 인쇄 0x11223344 같은 이유는 0x44332211?

답변

6

귀하의 프로그램이 리틀 엔디안 컴퓨터 (예 : x86)에서 실행된다고 가정하면 ntohl (a)은 0x11223344를 반환합니다 (즉, htonl()처럼 0x11223344 값의 바이트 순서를 뒤집을 것입니다).

반면에 프로그램이 big-endian 시스템 (예 : PowerPC Mac)에서 실행 중이면 ntohl (a) 및 htonl (a)는 모두 기계의 내부/호스트 형식은 이미 네트워크 형식과 동일합니다.

또한 빅 엔디 언 또는 리틀 엔디안이 아닌 숫자 표현을 사용하는 일부 unusual hardware에서 프로그램이 실행되고있을 가능성이 있습니다. 이 경우 해당 환경의 htonl() 및 ntohl() 함수는 해당 시스템의 내부 표현을 표준 네트워크 표현 (big-endian)으로 변환하는 올바른 작업을 수행하도록 프로그래밍되었을 것입니다. 뒤로.

이 함수의 예상 사용 패턴이있다 :

  • 언제 당신은 네트워크에 긴을 보내려고, 그 위에 htonl()를 호출하는 대신 그 값을 보낼 수 있습니다.
  • 방금 ​​네트워크에서 길게 수신 한 경우 언제든지 ntohl()을 호출하고 그 값을 대신 사용하십시오.

호스트 컴퓨터의 숫자 표현과 네트워크/빅 엔디안 표현 간의 차이가 htonl() 및 ntohl() 내부에서 자동으로 처리되므로 작성에 대해 걱정할 필요가 없습니다. testing!) 프로그램이 실행될 가능성이있는 모든 컴퓨터 아키텍처에 대한 별도의 변환 코드.

8

이 게시물을 우연히 발견했습니다. 나는 Jeremy의 대답에 동의하지만, 단지 한 가지만 더 덧붙이 길 원한다. 의심 스럽다면, 소스 코드로 가라.당신이 GCC 라이브러리에 ntoh()와 hton()의 정의를 보면 :()

< netinet/in.h>

# if __BYTE_ORDER == __LITTLE_ENDIAN 
#define ntohl(x)  __bswap_32 (x) 
#define htonl(x)  __bswap_32 (x) 
#endif 

그래서, 모두 ntohl()와 htonl입니다 단지 byteswap.h에 정의 된 스왑 바이트. 이것이 두 매크로에서 출력이 같은 이유입니다.

지금, 그들은 왜 똑같습니까 ??? 글쎄, 저자는 Network Endian Data (일반적으로 수신 된 패킷 버퍼의 내용)에서 ntohl()을 사용하고 Host Endian Data (호스트에서 작성한 데이터)에서 htonl()을 호출하도록했습니다.

위의 두 매크로를 동일한 Host Endian 데이터에서 호출하고 있는데 문제가 있습니다.

추측에 늦습니다. 그러나 다음 방문객이이 답변을 유용하게 사용하기를 바랍니다.

관련 문제