2014-02-24 2 views
2

는 빅 엔디안은 다른 컴퓨터에서 바이트 배열을 변환하기 위해, 우리는 사용할 수 있습니다 : 다른 시스템은 리틀 엔디안 경우 우리가 필요 왜hton/ntoh를 언제 사용하고 데이터를 언제 변환해야합니까?

long long convert(unsigned char data[]) { 
    long long res; 
    res = 0; 
    for(int i=0;i < DATA_SIZE; ++i) 
    res = (res << 8) + data[i]; 
    return res; 
} 

, 우리가

long long convert(unsigned char data[]) { 
    long long res; 
    res = 0; 
    for(int i=DATA_SIZE-1;i >=0 ; --i) 
    res = (res << 8) + data[i]; 
    return res; 
} 

을 사용할 수 있습니다 위의 기능? 수신 할 때 발신자와 수신자에게 hton을 사용하면 안됩니까? 그것은 hton/nton이 convert()가 char 배열 인 동안 정수를 변환하기 때문입니까?

답변

5

hton/ntoh 기능 위해 네트워크 및 위해 호스트 사이의 변환. 이 2 개가 동일하면 (즉, 빅 엔디안 머신에서) 이러한 함수는 아무 것도 수행하지 않습니다. 따라서 엔디안을 교환하기 위해 이식 할 수 없습니다. 또한 지적했듯이 16 비트 (htons) 및 32 비트 (htonl) 정수에 대해서만 정의됩니다. DATA_SIZE의 설정 방법에 따라 코드가 sizeof(long long)까지 처리 할 수 ​​있습니다.

+0

@ dvnrrs : 다른 방법으로 물어 보겠습니다. 컴퓨터에서 int를받을 때 (어떤 컴퓨터에서도 가능), convert()를 사용해야합니까? 귀하의 답변에서, 그것은 ntoh 것 같아요 변환 ntoh는 짧은 및 int, 긴 긴 바이트 배열을 처리 할 수 ​​제외하고 같은 일을하고있다. 감사합니다 – user389955

+0

@ user389955 그것은 네트워크 프로토콜에 따라 다릅니다! 보낸 사람이 빅 엔디안 * (= "네트워크 주문") 값을 제공하고 16 비트 또는 32 비트 정수라고 약속하면 htons/htonl을 안전하게 사용할 수 있습니다. 그렇지 않으면 게시 한 것과 같은 사용자 정의 코드가 필요합니다. – TypeIA

관련 문제