Декодирование ввода base64 с помощью объекта Buffer

У меня есть клиентский интерфейс, который отправляет двоичные данные в кодировке 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 и к строкам?


person Greg    schedule 23.11.2011    source источник
comment
Что не работает? Кроме того, действительно ли данные в полях utf8?   -  person thejh    schedule 23.11.2011
comment
В этих консольных операторах ничего не печатается ... Я просто обновил вопрос, чтобы отразить тот факт, что я проверил путь кода с известной текстовой строкой, закодированной с помощью base64.   -  person Greg    schedule 23.11.2011
comment
Он печатает ... event type: / или ничего?   -  person thejh    schedule 23.11.2011
comment
У меня работает (хотя в ваших данных есть странные байты, это просто пробелы и один байт)   -  person thejh    schedule 23.11.2011
comment
Попутно я обнаружил, что параметры, используемые в slice (), являются индексами, а не байтовыми смещениями. Так что мой нынешний подход просто не сработает. Мне нужно научиться преобразовывать данные base64 в поток байтов или массив шестнадцатеричных значений и вырезать их, чтобы перейти к отдельным байтам в данных.   -  person Greg    schedule 23.11.2011


Ответы (2)


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

var event_type = buff.slice(3,6).toString('hex');  => '00010a'
person Teemu Ikonen    schedule 23.11.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 байта), вам нужно перебрать индексы массива.

person Greg    schedule 23.11.2011