2011-11-08 98 views
4

我試圖用緩衝區解析29個字節的數據格式奇怪的方式。我一直在使用slice()方法來分割這些奇怪邊界上的數據。樣本流類似於十六進制中的以下內容(爲清楚起見,添加了空格)...Node.js數據解析與緩衝區的原始字節

01 1d 00 00 01 0a 0a 0b 0b 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。接下來的所有切片都是錯誤的。

我很明顯誤解了這裏的編碼。在Buffer實例化過程中或在toString()提取過程中。

如何將此輸入流視爲一系列十六進制字符串並將它們轉換爲可操作的二進制數據?

謝謝!

+0

是否'buff.slice(位置,位置+ 1)'返回單個字符或兩個字符? – sarnold

+0

該緩衝區上的toString()結果是一個字符長。但toString()結果在 - buff.slice(position,position + 6);是12個字符長。 – Greg

回答

4

我認爲答案是,你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...'只是爲了填充一些二進制數據的緩衝區,而不是什麼在你的程序實際發生的嘗試 - - 使用簡單版本的實際填充緩衝區可能會更容易。也許從文件中讀取它?

+0

你是對的,我的例子並不完全準確。原始數據中沒有空格。我會編輯這個問題來反映這一點。 – Greg

+0

但是你正在交給一個字符串與二進制數據的ascii編碼的十六進制值?或者你正在交給實際的二進制數據? – sarnold

+0

我正在使用的示例是一串ascii編碼的十六進制值。而我的原始解決方案正在工作 - 我只是錯誤地增加了位置變量。我很好奇,如果數據通過Web服務接口傳遞,是二進制數據甚至是一個選項? – Greg

14

Node的Buffer直接與hex編碼支持此:

var raw = '011d0000010a0a0b0b0c0c000004d20000000ec800000000000000ccc4'; 
var buff = new Buffer(raw, 'hex');