2009-12-05 3 views
2

UDP를 통해 빅 엔디안 데이터를 받고 리틀 엔디 언으로 변환합니다. 소스는 정수가 서명되었지만 signed int (특히 16 비트)의 바이트를 교환 할 때 비현실적인 값을 얻습니다. 서명되지 않은 int로 그들을 교환 할 때 나는 내가 기대하는 것을 얻는다. 원본 문서가 잘못되어 실제로 부호없는 16 비트 int를 보내는 것으로 가정합니다. 하지만 그게 왜 중요할까요? 값은 모두 양수이고 16 비트 INT_MAX 아래에 있어야하기 때문에 오버 플로우가 문제가되지 않아야합니다. 내가 생각할 수있는 유일한 것은 (1) 문서가 잘못되었다는 것입니다. (2) 서명 된 엔디안 스왑을 수행 할 때 제대로 서명 비트를 처리하지 않을 것입니다.부호있는 int의 엔디안 변환

1) 오버 플로우가 문제가 아니라, 내가 서명 또는 부호의 int로 읽어 여부 문제가 않습니다

은 정말 두 가지 질문이 있습니다.

2) 부호있는 값과 부호없는 값 사이에서 엔디안 스와핑이 다른가 (즉, 부호 비트를 다르게 처리해야합니까?)?

엔디안 변환이 부호있는 값과 부호없는 값 모두에 대해 동일하게 보인다고 생각했습니다. 16 비트의 경우 value = value&0xff00 >> 8 | value&0x00ff << 8.

감사

+1

어떤 프로그래밍 언어입니까? – bmargulies

+0

괄호를 달았 으면 좋겠습니다 (C 인 경우). –

답변

12

당신은 스왑 기능의 기호 확장 문제로 실행하고 있습니다. 대신이 일을 :

value & 0xff00 >> 8 | value & 0x00ff << 8 

이 작업을 수행 :

((value >> 8) & 0x00ff) | ((value & 0x00ff) << 8) 

문제는 value는 16 비트 부호있는 값이 있다면, 0xabcd >> 80xffab 것입니다. 부호있는 오른쪽 시프트에서 1로 시작하면 최상위 비트는 1로 유지됩니다.

마지막으로이 함수를 직접 작성하는 대신 ntohs()을 사용해야합니다.

+3

ntohs는 일반적인 c 라이브러리 함수가 아니라 (bsd) 소켓 라이브러리의 함수입니다. 유용하지만, 엔디안 유틸리티 함수를 얻기 위해 소켓 라이브러리를 가져 오는 것이 약간 이상합니다 : P –

+3

UDP 통신을 할 때 소켓 함수를 사용하는 것은 이상한 일이 아닙니다. –

+0

부호없는 값에도 사용할 수 있습니까? – MarcusJ

0

동의 함, ntoh(), hton() 등을 사용합니다.