Данные Node.js анализируют необработанные байты с помощью буфера - PullRequest
5 голосов
/ 09 ноября 2011

Я пытаюсь использовать буфер для разбора 29 байтов данных, которые отформатированы нечетным образом. Я использовал метод slice (), чтобы разделить данные на этих нечетных границах. Пример потока в шестнадцатеричном виде выглядит следующим образом (для ясности добавлены пробелы) ...

01 1d 00 00 01 0a 0a 0b 0b 0c 0c 0c 00 00 04 d2 00 00 00 0e c8 00 00 00 00 00 00 00 cc c4

var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4';
buff = new Buffer(raw, 'utf8');
var position = 2;

// message type
var msg_type = buff.slice(position,(position+1)).toString();
position += 1;
console.log('... message type is ' + msg_type);

// event type
var event_type = buff.slice(position,(position+1)).toString();
position += 1;
console.log('... event type is ' + event_type);

// grab more data...

Это создает msg_type = 1 и event_type = 0. Должно быть 0 и 1 соответственно. Все последующие фрагменты неверны.

Я явно что-то не так понимаю с кодировкой здесь. Либо во время создания буфера, либо при извлечении toString ().

Как мне обработать этот входной поток как последовательность шестнадцатеричных строк и преобразовать их в двоичные данные, с которыми я могу работать?

Спасибо!

Ответы [ 2 ]

14 голосов
/ 18 мая 2012

Буфер Node's поддерживает это напрямую с кодировкой hex:

var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4';
var buff = new Buffer(raw, 'hex');
5 голосов
/ 09 ноября 2011

Я думаю, что ответ в том, что ваш Buffer не представляет объект, который вы думаете, что он делает:

> var raw = '01 02 03'
> buff = new Buffer(raw, 'utf8')
<Buffer 30 31 20 30 32 20 30 33>
> buff.slice(0,0)
<Buffer >
> buff.slice(0,1)
<Buffer 30>
> buff.slice(0,2)
<Buffer 30 31>
> buff.slice(0,3)
<Buffer 30 31 20>
> buff.slice(0,0).toString()
''
> buff.slice(0,1).toString()
'0'
> buff.slice(0,2).toString()
'01'
> buff.slice(0,3).toString()
'01 '
> buff.slice(0,4).toString()
'01 0'
> buff.slice(0,5).toString()
'01 02'
> buff.slice(0,6).toString()
'01 02 '
> buff.slice(0,7).toString()
'01 02 0'
> buff.slice(0,8).toString()
'01 02 03'
> buff.length
8

Вместо представления буфера длиной три байта он представляет буфер длиной 8 байтов. Врезаясь в него, вы получаете отдельные шестнадцатеричные значения символов. (Обратите внимание, что пробел равен 20 - точно так же, как %20, столь распространенный в URL-адресах.)

Но я чувствую, что ваша var = '01 1d 00...' - это просто попытка заполнить буфер некоторыми двоичными данными, а не то, что на самом деле происходит в вашей программе - может быть проще работать с упрощенной версией того, как вы на самом деле заполнение буфера. Может быть, прочитать его из файла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...