2010-07-05 4 views
1

16 비트 2의 보수를 두 부분으로 전달하는 독점 프로토콜로 작업하고 있습니다. LSB가 먼저 전송 된 다음 MSB가 전송됩니다. 원래 값을 올바르게 복원하는 다음 코드가 있습니까?16 비트 부호있는 정수 (2의 보수)의 MSB와 LSB를 결합하십시오.

unsigned char message[BLK_SIZE]; 
// read LSB to message[0] and MSB to message[1] 
short my_int = (message[1] << 8) | message[0]; 
+0

나에게 확인을 보이는 - 당신이 정확하지 않을 수 있다고 생각하게 무엇? –

+0

네, 괜찮아 보입니다. 특정 응용 프로그램의 컨텍스트에서 정상인지 여부를 알려주는 테스트를 작성해야합니다. –

+0

@Paul : 아아, 내가 언급 했어야합니다. 나는 확실하지 않다. 왜냐하면 : 1) IIRC short는 16 비트로 보장되지 않는다. 8 또는 32의 경우 어떻게됩니까? 2) 서명되지 않은 char에서 작동하고 예상대로 짧은 동작을 할당합니까? – Marco

답변

1

나는 코드가 어떤 플랫폼에서 실패 할 수 있도록 short는, 16 비트가 아닌 경우 그 코드가 실패합니다 생각합니다. 당신은 결코 실패한 플랫폼을 찾을 수 없을 것입니다.

int16_t (대상 플랫폼에서 사용 가능한 경우)가 더 나은 선택 일 수 있습니다.

+0

int16_t의 출처는 어디입니까? 그 표준은 C + +, C 또는 일부 POSIX 물건인가요? – Marco

+0

반바지는 최소 16 비트 여야하므로 코드가 정상입니다. –

+0

http://linux.die.net/man/3/int16_t – codymanix

0

코드는 올바른 보이지만, 당신은 당신의 프로토콜이 진정으로 플랫폼 독립적 인 것을 보장하기위한 고유 C의 기능을 사용할 수 있습니다

short my_int = ntohs(*(short*)message)

+0

그는 자신의 프로토콜에 맞는 변환을 원합니다. –