首页 > 开发 > NodeJS > 正文

Nodejs的buffer和es6二进制数组

2017-09-08 17:24:12  来源:网友分享

请问node中的buffer和es6二进制数组的联系?

解决方案

ES6之前,JS无法直接处理二进制数据。Node为了弥补这个不足,加入了Buffer。

ES6加入了处理二进制数据的一些类,这些类和Buffer功能大体一致,也有不同之处。下面简单说说不同点。

ES6

ES6处理二进制数据更为谨慎,提供很多的相关类。ArrayBuffer用来表示原始的二进制数据,然而你并不能直接操作它所表示的二进制数据。你可以通过TypedArray,把二进制数据当做某种基础数据类型的数组来访问,或者用DataView来读写,修改二进制数据。

TypedArray仅仅是一个概念,并不是直接可以使用的类。TypedArray指的是如下几个类。

  • Int8Array

  • Uint8Array

  • Uint8ClampedArray

  • Int16Array

  • Uint16Array

  • Int32Array

  • Uint32Array

  • Float32Array

  • Float64Array

如名字所示,分别用相应的数据格式表示相应的二进制数据,这里不存在转换。

DataView是用来读写二进制数据的,你可以从已有的二进制数据上创建,以此来操作这些二进制数据。关键的是如果需要指定大端还是小段,需要作为参数传入。例如dataview.getInt32(byteOffset [, littleEndian])

Node

用于表示二进制数据的只有一个Buffer类,在这个类上,你可以读写数据,访问数据。这个应该不用多说了,多多少少很定用过吧。

其他

使用

其实我觉得Buffer方便,DataView必须在ArrayBuffer或者TypedArray之上创建,所以用起来稍显麻烦,不过读写操作上二者差不多。

源码

ArrayBuffer那些类,会由v8实现,而Buffer其实用的也是用v8ArrayBuffer来封装的。

// Node.JS 6.3.1 src/node_buffer.cc 309行MaybeLocal<Object> New(Environment* env, size_t length) {  EscapableHandleScope scope(env->isolate());  // V8 currently only allows a maximum Typed Array index of max Smi.  if (length > kMaxLength) {    return Local<Object>();  }  void* data;  if (length > 0) {    data = BUFFER_MALLOC(length); // 用malloc直接分配内存    if (data == nullptr)      return Local<Object>();  } else {    data = nullptr;  }  Local<ArrayBuffer> ab = // 将内存封装成ArrayBuffer    ArrayBuffer::New(env->isolate(),        data,        length,        ArrayBufferCreationMode::kInternalized);  Local<Uint8Array> ui = Uint8Array::New(ab, 0, length); // Buffer一开始都是Uint8Array  Maybe<bool> mb =      ui->SetPrototype(env->context(), env->buffer_prototype_object());  if (mb.FromMaybe(false))    return scope.Escape(ui);  // Object failed to be created. Clean up resources.  free(data);  return Local<Object>();}

所以基本可以认为Buffer是对ES6处理二进制数据方法的一种封装。你不用去编写Uint8Array,DataView等类来处理数据,直接在Buffer上操作就可以了。而且这种C/C++的封装也比JS自己写好很多。

问题在于ES6的更加强大,甚至出现了SharedArrayBuffer,分配在共享内存上,感兴趣可以查一查资料。

最后

后半夜大了这么多字,给点赞同呗,^_^。