Node.js之使用Buffer類處理二進位數據 Buffer類可以在處理TCP流或文件流時處理二進位數據,該類用來創建一個專門存放二進位數據的緩存區。 1. 創建Buffer對象 1.1 直接創建: bur = new BUffer(123) //123 為bur緩存區長度 1.2 初始化緩存區內 ...
Node.js之使用Buffer類處理二進位數據
Buffer類可以在處理TCP流或文件流時處理二進位數據,該類用來創建一個專門存放二進位數據的緩存區。
1. 創建Buffer對象
1.1 直接創建:
bur = new BUffer(123) //123 為bur緩存區長度
1.2 初始化緩存區內容可以用fill屬性:
bur.fill(value,[offset],[end])
//value:為必填參數,數值為需要寫入的數值
第二個參數為數據寫入的起始位置,預設為0
第三個參數為數據寫入的終止位置,預設為最尾端
1.3 填充數據可以直接填入數組
bur = new Buffer(array)
1.4 Buffer類還可以用字元串填充:
bur = new Buffer(str,[encoding])
//第一個參數為必填參數,為字元串
第二個參數為指定文字編碼格式,預設為utf8
還可以為:
編碼 | 說明 | 編碼 | 說明 |
---|---|---|---|
ascii | ASCII字元串說明 | base64 | 經過BASE64編碼後的字元串 |
utf8 | UTF-8字元串 | binary | 二進位數據(不推薦使用) |
utf16le | UTF-16LE字元串 | hex | 使用16進位數值表示的字元串 |
ucs2 | UCS2字元串 |
2. 字元串的長度與緩存區的長度
字元串的長度與緩存區的長度是不同的,字元串定義後,不能改變,但在緩存區可以改變一些值,例如:
[root@kuber3 ~]# node
> str = '我是誰'
'我是誰'
> bur = new Buffer(str)
<Buffer e6 88 91 e6 98 af e8 b0 81>
> str.length
3
> bur.length
9
> str[1] ='yuan'
'yuan'
> str
'我是誰'
> str = '我是誰'
'我是誰'
> fur = new Buffer(str)
<Buffer e6 88 91 e6 98 af e8 b0 81>
> fur[0] = 0
0
> fur
<Buffer 00 88 91 e6 98 af e8 b0 81>
>
利用slice對象可以選出指定為對象,但在緩存中slice出的對象即是元數據。緩存區中的真實值,隨意一旦改變,緩存區中的值也會變:
> buf = new Buffer('我愛你')
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> subBuf = buf.slice(1,3)
<Buffer 88 91>
> subBuf[0] = 0
0
> subBuf
<Buffer 00 91>
> buf
<Buffer e6 00 91 e7 88 b1 e4 bd a0>
>
3. Buffer對象與字元串對象之間的相互轉換
3.1 Buffer對象的toString可以將Buffer對象那個轉換為字元串,
buf。toString([encoding],[start],[end])
//第一個參數用於指定Buffer對象保存的文字編碼格式
第二個與第三個為被轉換數據的起始地址和終止地址
3。2 Buffer對象的write方法
如果需要向已創建的Buffer對象中寫入字元串,這時可以使用write方法:
buf.write(string,[offfset],[length],[encodind])
//第一個參數為必填參數:為需要寫入的字元串
第二個與第三個參數為字元串的寫入位置 offset+1~offset+length
第四個參數為寫入字元串使用的編碼格式
###3.3 StringDecoder 對象
其作用與toString相同,但需要引入string_decoder模塊
var StringDecoder = require('string_decoder').StringDecoder
var decoder = new StringDecoder([encoding])
//c參數為制定轉換字元串時所用的編碼格式,預設為utf8
利用StringDecoder.write可以將Buffer對象中數據轉換成字元串
decoder.write(buffer)
4. Buffer對象與數值對象之間的相互轉換 讀寫Buffer對象中的數據所有方法
方法名 | 數據類型 |
---|---|
buf.readUInt8(offset,[noAssert]) | 8位無符號整數 |
buf.writeUInt8(value,offset,[noAssert]) | |
buf.readUInt16LE(offset,[noAssert]) | 16位無符號整數(Little Endian) |
buf.writeUInt16LE(value,offset,[noAssert]) | |
buf.readUInt16BE(offset,[noAssert]) | 16位無符號整數(Big Endian) |
buf.writeUInt16BE(value,offset,[noAssert]) | |
buf.readUInt32LE(offset,[noAssert]) | 32位無符號整數(Little Endian) |
buf.writeUInt32LE(value,offset,[noAssert]) | |
buf.readUInt32BE(offset,[noAssert]) | 32位無符號整數(Big Endian) |
buf.writeUInt32BE(value,offset,[noAssert]) | |
buf.readInt8(offset,[noAssert]) | 8位有符號整數 |
buf.writeInt8(value,offset,[noAssert]) | |
buf.readInt16LE(offset,[noAssert]) | 16位有符號整數(Little Endian) |
buf.writeInt16LE(value,offset,[noAssert]) | |
buf.readInt16BE(offset,[noAssert]) | 16位有符號整數(Big Endian) |
buf.writeInt16BE(value,offset,[noAssert]) | |
buf.readInt32LE(offset,[noAssert]) | 32位有符號整數(Little Endian) |
buf.writeInt32LE(value,offset,[noAssert]) | |
buf.readInt32BE(offset,[noAssert]) | 32位有符號整數(Big Endian) |
buf.writeInt32BE(value,offset,[noAssert]) | |
buf.readFloatLE(offset,[noAssert]) | 單精度浮點數(Little Endian) |
buf.writeFloatLE(value,offset,[noAssert]) | |
buf.readFloatBE(offset,[noAssert]) | 單精度浮點數(Big Endian) |
buf.writeFloatBE(value,offset,[noAssert]) | |
buf.readDoubleLE(offset,[noAssert]) | 倍精度浮點數(Little Endian) |
buf.writeDoubleLE(value,offset,[noAssert]) | |
buf.readDoubleBE(offset,[noAssert]) | 倍精度浮點數(Big Endian) |
buf.writeDoubleBE(value,offset,[noAssert]) |
其中read方法中第一個參數[offset]表示獲取數據的起始位,單位為位元組;第二個參數[noAssert]為一布爾值,表示是否對offset值進行驗證,false:如果offset參數超出緩存區長度,則拋出異常,為true時,不拋出異常
其中write方法第一個參數value為需要寫入的整數,第二個參數offset指定數據起始寫入的位置;第三個參數為布爾型,false:如果offset參數值超出緩存區的長度,會拋出異常,為true不會拋出異常
5. BUffer對象與JSON對象之間的相互轉換
在NOde.js中,可以使用JSON.stringify方法將Buffer對象中保存的數據轉換為一個字元串,也可以使用JSON.parse方法將一個經過轉換後的字元串還原為一個數組
eg:
[root@kuber3 ~]# node
> buf = new Buffer('我愛你')
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> json= JSON.stringify(buf)
'{"type":"Buffer","data":[230,136,145,231,136,177,228,189,160]}'
> copy = new Buffer(JSON.parse(json))
<Buffer e6 88 91 e7 88 b1 e4 bd a0>
> copy.toString();
'我愛你'
>
6. 複製緩存數據
將一個BUffer對象保存到兩一個Bufer對象中可利用copy方法:
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
//第一個參數:必選,指定複製目標Buffer對象
第二個參數:指定目標Buffer對象中從第幾個位元組開始寫入,預設為0
第三個參數:指定複製源Buffer對象中獲取數據的起始位置,預設為0
第四個參數:指定從複製源Buffer對象中獲取數據的結束位置,預設為複製源Buffer的長度
7. Buffer類的方法
7.1 isBuffer方法 判斷是否為一個Buffer對象
Buffer.isBuffer(obj)
7.2 byteLength方法 計算一個指定字元串的位元組數
Buffer.byteLength(string,[encoding])
//d第一個參數:必選,指定需要計算位元組數的位元組符
第二個參數:按什麼編碼來計算位元組數,預設為utf8
7.3 concat方法 將幾個Buffer對象結合創建一個新的Buffer對象
Buffer。concatenate(list,【totalLength】)
//第一個參數:必選 為一個存放多個Buffer對象的數組
第二個參數:指定被創建的Buffer對象的總長度
7.4 isEncoding方法 用於檢測一個字元串是否為一個有效的編碼格式字元串
Buffer.isEncoding(encoding)