2012-04-01 2 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

Я бы настоятельно предложил просто не использовать приводы таким образом. Проверьте спецификацию используемого протокола и интерпретируйте четыре байта в соответствии с этим протоколом. Не просто делайте то в «int» с отливом и надейтесь на лучшее. –

ответ

5

Игнорирования очевидной ошибки, что вы звоните returnvoid в функции ...

recv функции, по definition, возвращает целое число, уведомляющее, количество прочитанных байт (или отрицательными, если ошибка). Если вы хотите прочитать байты и вернуть их, вы должны указать 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]); 

Во-первых, вы должны убедиться, что вы видите "130 0 0 0" или "0 0 0 130" из приведенного выше примера.

Теперь попробуйте добавить:

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

И посмотреть, если вы получите 130. Если да, то велика. Если вы вместо этого получаете 2 181 038 080 или -33 554 432, это означает, что ваши байты в неправильном порядке (google 'endianness'). Вы можете исправить это с помощью команды байт-переназначения:

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

ntohl переупорядочиваем байты, чтобы порядок байт соответствует локальный компьютер.

2

Код является ошибочным. Функция объявлена ​​как не возвращающая значение, но она делает это.

recv возвращает количество прочитанных байтов, поэтому оно будет печатать 4, а чтение целых будет сохранено в m_iVersion. Является ли целое число 130 или большим числом, зависит от консистенции компьютера.

Смежные вопросы