2012-04-01 4 views
3

아래 코드는 소켓에서 정수로 4 바이트를 읽는 것입니다. 바이트가 (십진수로) 130 0 0 0임을 알 수 있습니다. 아래 코드가 버전 130을 반환한다고 의심하지만 이유는 모르겠습니다. 이것이 130으로 돌아갈 것인가? Java로 복제하려고 시도했지만 매우 큰 음의 수 (기대했던 것보다 많음). 아래의 의사/C 코드를 어떻게 해석합니까?4 소켓 바이트를 int로 변환

#include <socket.h> 
void readVersion(char *buf, int iCount) { 
     recv(hSocket, buf, iCount, MSG_WAITALL); 
} 
int m_iVersion; 
readVersion((char *) &m_iVersion, sizeof (m_iVersion)) 
count << m_iVersion; 
+5

당신의 진정한 질문은 _ [endianness] (http://en.wikipedia.org/wiki/Endianness) _라고 생각합니다. – ildjarn

+5

반환 할 'void'함수는 무엇입니까? – SingleNegationElimination

+0

저는이 방법으로 캐스트를 사용하지 말 것을 강력히 권합니다. 구현중인 프로토콜에 대한 사양을 확인하고 해당 프로토콜에 따라 4 바이트를 해석하십시오. 캐스팅과 함께 최선을 다해 희망을 품고 'int'를 채우지 마십시오. –

답변

5

definition에 의해 당신이 void 기능에 return를 호출 명백한 오류 ...

recv 기능을 무시하고, 당신에게 바이트 수를 말하는 정수를 읽고 (또는 음의 오류 경우)을 반환합니다. 바이트를 읽고 반환하려는 경우 cout 버퍼가 아닌 읽은 바이트 수를 원합니다.

그러나, int을 인쇄하면 예상 한대로 바이트 단위가 아닌 전체 내용이 인쇄됩니다. 이런 건 어때?

int nb, i; 
union { 
    uint32_t whole; 
    char bytes[4]; 
} v; 
nb = recv(hSocket, v.bytes, 4, MSG_WAITALL); 
if (nb != 4) 
    printf("Error: recv returned: %d\n", nb); 
else 
    printf("%d %d %d %d\n", v.bytes[0], v.bytes[1], v.bytes[2], v.bytes[3]); 

첫째, 당신은 당신이 위의 예에서 "0 0 0 130", "130 0 0 0"또는보고하고 있는지 확인해야한다.

printf("%u\n", v.whole); 

을 그리고 당신이 할 경우 (130)을받을 경우 큰, 참조 :

이제 추가하려고합니다. 대신 2 181 038 080 또는 -33 554 432을 얻으면 바이트 순서가 잘못되었다는 것을 의미합니다 ('endianness'). 당신은 바이트 재정렬 명령을 사용하여이 문제를 해결할 수 있습니다

v.whole = ntohl(v.whole); 
printf("%u\n", v.whole); 

ntohl 재 주문을 바이트 엔디안 로컬 컴퓨터를 일치하도록.

2

코드에 결함이 있습니다. 이 함수는 값을 반환하지 않는다고 선언하지만 아직 수행합니다.

recv은 읽은 바이트 수를 반환하므로 4가 인쇄되고 정수 읽기는 m_iVersion에 저장됩니다. 정수가 130 이상인지 여부는 컴퓨터의 엔디안 유형에 따라 다릅니다.