2014-02-27 5 views
2

빅 엔디안 인 네트워크에서 버퍼를 수신하고 있으며 리틀 엔디안 시스템에 있습니다. 시스템에서 사용하기 전에 버퍼를 되돌려 야합니까? 엔디안이 단일 형식에 대한 바이트 순서 만 뒤집을 지 또는 전체 버퍼에도 적용되는지 확실하지 않습니다.엔디안이 배열을 뒤집을 수 있습니까?

예를 들어, 네트워크에서 unsigned long의 버퍼를 받고 있다고 가정 해 봅시다. 그리고 저는 리틀 엔디안 시스템을 사용하고 있습니다.

for(int i=0;i<size;i++) 
    system_buffer[i]=ntohl(network_buffer[i]); 

내가 system_buffer를 사용하기 전에, 나는 또한 그것을 반대해야합니까 (그래서 마지막 요소는 첫 번째 요소 및 비자 반대가됩니다) : 코드는이 있을까? 또한

reverse_buffer(system_buffer); 

, I는 unsigned char의 배열을 수신하는 경우가있어, I 전혀 엔디안을 보상해야 하는가, 또는 그대로-I는 버퍼를 사용합니까?

감사합니다.

+4

읽기 내용 : http : //commandcenter.blogspot.co.uk/2012/04/byte-order-fallacy.html – this

답변

3

endianess는
즉 단일 변수에만 적용 할 수 있습니다. 배열의 요소 순서가 아니라 각 배열 요소 값에만 적용됩니다.

1 바이트 변수의 바이트 순서를 반대로 할 수 없으므로
아무 것도 지정하지 않아도됩니다.

1

endianness는 1 바이트보다 큰 정수의 바이트 순서에만 영향을줍니다 (즉, 바이트 또는 int8_t에는 영향을주지 않음).

정수가 어떤 바이트 순서로 프로토콜 설명을 읽을 필요가 있습니다.

1

endianness는 데이터 워드의 바이트 순서 (비트가 아님)에만 영향을줍니다. char은 항상 1 바이트 크기이므로 조정할 필요가 없습니다. 표준 라이브러리 함수 ntohl은 네트워크 바이트 순서 (n)에서 호스트 바이트 순서 (h)로 부호없는 정수 (l)의 바이트 순서를 변경합니다. 따라서 버퍼를 사용하기 전에 버퍼를 되돌릴 필요가 없습니다. 버퍼의 각 요소의 바이트 순서 만 변경하면됩니다.

for(int i = 0; i < size; i++) { 
    // network byte order to system byte order 

    system_buffer[i] = ntohl(network_buffer[i]); 
} 

// process system_buffer 
관련 문제