簡體   English   中英

使用Buffer對象解碼base64輸入

[英]Decoding base64 input with a Buffer object

我有一個客戶端接口,該接口發送以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再到字符串嗎?

數據似乎沒有有效的ASCII或UTF-8字符串,event_type和addr是一些二進制數據。 使用十六進制表示法並進行打印。

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

此實現的問題是使用slice()解析字節流。 slice()的參數是索引-不是字節偏移量。 這似乎是一個很大的缺陷。 我不確定為什么有人在與緩沖區交互時會這樣做。

無論如何,解決方案是將buff作為數組進行訪問。

// 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個字節),則必須遍歷數組索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM