Node.js 二进制缓冲区

JS 善于处理字符串,但由于最初是被设置用来处理 HTML 文档的,因此并不善于处理二进制数据。JS中即没有字节类型,也没有结构化类型,甚至没有字节数组类型,只有数值类型和字符串类型。

由于Node是基于JS开发的,所以它可可以处理类似 HTTP 这样的文本协议,也可用它来与数据库通信、操作图像、上传文件。想想下,如果只是用字符串完成上诉任务将相当困难。

在早期Node通过将每个字节编码为文本字符来处理二进制数据,事实证明这种做法即浪费资源,速度有缓慢,还不可靠,并且难以控制。

为了处理类二进制数据,Node引入二进制缓冲区实现,该实现以 Buffer 伪类中的JS API形式暴露给外界。缓冲区的长度以字节为单位,并可以随机设置和获取缓冲区中的数据。

Buffer类的另一个特别之处是数据占用的内存并不是分配在 JavaScript VM内存堆中,这些对象不会被垃圾收集算法处理。它会占据一个不会被修改的永久内存地址,以避免因缓冲区内存的内存复制所造成的CPU浪费。

创建缓冲区

默认使用 UTF-8 编码格式的字符串来创建缓冲区

// 默认使用UTF-8编码格式创建缓冲区
var buf = new Buffer('hi');

// 指定编码格式的字符串创建缓冲区
var buf = new Buffer('hi', 'base64');

可被接收的编码格式与标识符

  • UTF-8 utf8
    一种变宽度的编码格式,可表示 Unicode 字符集中任意字符,是网络首选编码格式。默认使用utf8编码格式。
  • ASCII ascii
    仅适用于 ASCII 字符集
  • Base64 base64
    基于64个可打印的ASCII字符来表示二进制数据,Base64用于字符文档内嵌入可被转换成字符串的二进制数据,在需要时可完整无损地转换会原来的二进制格式。

若缓存区没有用具体内存初始化,则可通过制定容量大小来创建缓冲区,以备将来容纳数据。

// 指定长度创建新的缓冲区
var buf = new Buffer(1024);//创建长度为1024字节的缓冲区

在缓冲区中获取或设置数据

创建或获取缓冲区后,可使用 [] 操作符来访问缓冲区中某个字节。

$ node

# 创建缓冲区
> var buf = new Buffer('create a new buffer');

# 访问缓存区中第10个字节
> console.log(buffer[10]);
101

当创建一个已被初始化的缓冲区时,该缓冲区中包含的数据并非是0,而是一些随机值。

// 本地测试却输出的是0
> var buf = new Buffer(1024);
> buf[100]
0 

可设置任意位置上的数据

# 将第100个位置上的数据设置为100
> buf[100] = 100

某些情况下,一些缓冲区操作并不会产生错误。

$ node
> var buf = new Buffer(1024)

# 若将缓冲区某位置设置为大于255的数,将会用256对该值取模,最终将取模结果赋值给该位置。
> buf[1] = 257
> buf[1]
1

# 若将缓冲区某位置设置为256则该位置实际是被赋值为0
> buf[2] = 256
> buf[2]
0

# 若将缓冲区某位置设置为小数则该位置仅会存储整数部分
> buf[3] = 100.123
> buf[3]
100

# 若尝试给超出缓冲区边界的位置赋值,则赋值操作将以失败告终,缓冲区不会发生变化。
> buf[1025]=100
> buf[1025]
undefined

通过查询缓冲区的length属性类获取其长度

> buf.length
1024

使用缓冲区长度迭代缓冲区内容,设置或获取每个字节。

for(var i=0; i<buf.length; i++){
  buf[i] = i;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 转自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的猫阅读 2,277评论 0 22
  • 广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较: 1. 能存储的数据类型不同 文本...
    时待吾阅读 11,690评论 2 28
  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,168评论 0 3
  • 大概每个人在使用软件时都遇到过乱码的问题,这是由于字符的编码和解码方式不一致导致,我们知道计算机只认识二进制数据,...
    楚客阅读 1,415评论 1 9
  • 红楼梦更像是一本佛经 处处有慈悲 处处都是觉悟 我们读红楼梦 更像是在读自己的一生 所以它是一本值得一生不同阶段去...
    丹青z阅读 198评论 3 3