Декодирование ввода base64 с помощью объекта Buffer - PullRequest
1 голос
/ 23 ноября 2011

У меня есть клиентский интерфейс, который отправляет двоичные данные, закодированные в base64.Данные представляют собой 29-байтовые пользовательские отформатированные данные, описывающие событие.29 байтов состоят из нескольких полей;каждый с уникальной длиной.

Мне нужен сервер для декодирования, чтобы я мог извлечь поля.Я попытался использовать объект Buffer , как это было в другом случае использования, когда данные были переданы в шестнадцатеричном формате , но безуспешно.

buff = new Buffer('AR0AAAEKCgsLDAwAAATSAAAADsgAAAAAAAAAzMQ=', 'base64');

// track the current position
// ... get out to the data portion of the message
var position = 3;

// event type
var event_type = buff.slice(position,(position+3)).toString('utf8');
position += 3;
console.log('... event type: ' + event_type + ' /');

// address
var addr = buff.slice(position,(position+3)).toString('utf8');
position += 3;
console.log('... addr: ' + addr + ' /');

.toString ('utf8'), вероятно, является основной причиной.Как я могу получить строку, которая представляет желаемые байты в этих вызовах slice ()?

Я не пишу двоичные данные на сервере, как это обычно бывает с кодировкой base64.Так должен ли я перейти от base64 к какой-либо другой кодировке для доступа к отдельным байтам?

Я использовал тот же код в известной текстовой строке, которая закодирована с base64, чтобы проверить базовую логику.Но когда исходные данные перед кодированием являются двоичными, операторы консоли ничего не выводят.Могу ли я перейти от двоичного к base64 к строкам?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

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

Независимо от этого, решение состоит в том, чтобы получить доступ к баффу в виде массива.

// event type
var event_type = buff[position].toString('utf8');
position += 1;
console.log('... event type: ' + event_type + ' /');

// address
var addr = buff[position].toString('utf8');
position += 1;
console.log('... addr: ' + addr + ' /');

Если вы хотите объединить несколько байтов (исходный пример имеет длину 3 байта), вы должны перебрать индексы массива.

0 голосов
/ 23 ноября 2011

Похоже, что в данных отсутствуют допустимые строки ASCII или UTF-8, а event_type и addr - это некоторые двоичные данные. Используйте шестнадцатеричное представление и распечатайте его.

var event_type = buff.slice(3,6).toString('hex');  => '00010a'
...