Js中的buffer

js没有c/c++这些语言对buffer天然的优势,为了处理buffer,js中引入了两个概念: ArrayBuffer和typed Array,分别作为buffer的本体和表象。nodejs采用了不同的方案:Buffer,把本体和表象合二为一了,所以Buffer和ArrayBuffer/typed Array都是buffer。

buffer作为二进制在js中有很多种表现形式:Uint8, Uint16, Uint32, Int16, Int32, Float等等

ArrayBuffer是buffer的本体,可是几乎没有任何表现,不过有两个操作:

  1. slice 从原来的ArrayBuffer中复制一段出来,这和Buffer中的策略不同,在Buffer中slice出来的新Buffer是和原来Buffer共享内存的。

  2. byteLength表示字节数量,也可以看成是ArrayBuffer的大小。

直接创建typed array会同时初始化一个相对应大小的ArrayBuffer在新建对象的buffer字段里,这个字段是不能变的。你也可以在初始化的时候直接传入ArrayBuffer,这样一来一个ArrayBuffer就可以和多个typed array共享了。

typed array是一个表现形式,从名字就可以看出来了,Uint8Array就是把buffer以一个字节为单位显示出一个无符号数字,Uint32Array就是以4个字节为单位显示出数字来。

Buffer是nodejs的产物,他作为一个类数组的存在和Uint8Array很像,都是按字节来表现的。他有很多读写数字的操作,无非就是各种不同表现形式的读写。不过添加了一个选项:端。

比如他有一个方法是readUint16LE,Uint16我们都懂,LE是什么意思呢?就是小端的意思比如一个16位数字0xabcd,可是小端表示就是也就是反着来。Uint32LE数字0x12345678就是<Buffer 78 56 34 12>。这些倒转是按字节为单位的,所以Uint8就没有LE/BE后缀,因为Uint8就一个字节。和LE相对应的就是正常表现方法BE了。