2013-11-16 5 views
0

Я пытаюсь прочитать uint16_t из указателя потока u_char (который, как представляется, указывает на заголовок ip), но мне трудно получить рациональный результат.Чтение uint16_t из потока бит

Прямо сейчас, когда я бегу:

uint16_t len16 = *stream; 

или когда я бегу следующий, в случае, если имеется несоответствие между сетевым и хост порядком байтов:

uint16_t len16 = *stream; 
len16 = ntohs(len16); 

я не получаю ожидаемый результат в uint16_t. Однако, когда я бегу:

uint8_t total_len1, total_len2; 
uint16_t total_len; 

//get length1 
total_len1 = *stream; 

//advance pointer 
stream += sizeof(uint8_t); 

//get length2 
total_len2 = *stream; 

//advance pointer 
stream += sizeof(uint8_t); 

Я получаю результаты я ожидаю в total_len1 и total_len2 в шестнадцатеричном формате. Итак, что здесь происходит и как я могу прочитать это значение непосредственно в uint16_t?

ответ

2

Чтение *stream получит значение одного элемента stream (a u_char или uint8_t). Вы хотите прочитать uint16_t от stream. В этом случае вам придется переделать его тип, чтобы читать его, как если бы это был массив uint16_t.

uint16_t len16 = *(uint16_t *)stream; 
len16 = ntohs(len16); 

Что происходит в памяти:

stream точек этой последовательности байтов:

| byte 1 | byte 2 | byte 3 | byte 4 | byte 5 | byte 6 | ... 
| uint8_t | uint8_t | uint8_t | uint8_t | uint8_t | uint8_t | ... 

stream является массивом uint8_t так, читая stream элементы, которые вы прочитали один байт в то время, ,

Теперь переделки stream типа, чтобы быть массивом uint16_t, вы можете прочитать байты в паре, образующий 16-битовые значения:

| byte 1 | byte 2 | byte 3 | byte 4 | byte 5 | byte 6 | ... 
|  uint16_t  |  uint16_t  |  uint16_t  | ... 

Будьте осторожны при использовании u_char, этот тип не является C++ стандарта и его размер может отличаться от компилятора к другому.

+0

Спасибо, это имеет смысл. Есть ли способ сообщить компилятору о явной длине для u_char? Библиотека, которую я использую для получения потока, дает его как поток const u_char. – amoeba

+0

Не знаю. Я думаю, что Microsoft Visual C++ может варьироваться от 8 до 16 в зависимости от того, как вы настроили свой проект на использование многобайтовых строк или нет. Вместо этого лучше используйте 'uint8_t', таким образом вы убедитесь, что используете 8-битную переменную. – Havenard

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