javascript - Nodejs的buffer和es6二进制数组

查看:125
本文介绍了javascript - Nodejs的buffer和es6二进制数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

请问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,分配在共享内存上,感兴趣可以查一查资料。

最后

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

这篇关于javascript - Nodejs的buffer和es6二进制数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆