[英]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.