Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript中的二进制数据

JavaScript中的二进制数据

作者头像
愧怍
发布于 2022-12-27 12:32:24
发布于 2022-12-27 12:32:24
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

在我编写 js 代码中,关于处理二进制数据了解甚少,好像都是用数组表示,但是成员又很模糊。尤其是在遇到一些 http 的 post 请求或 websocket,发送二进制数据(字节)时,还有一些算法的翻译,数据的转化,协议的复现,都需要不断的从网络上查阅,并未系统的从文档教程中入手。于是写这篇的目的就是为了加固对二进制数据的理解,以及 JavaScript 中如何操作二进制数据的。

ArrayBuffer

其他语言 java,易所表示的是字节数组,字节集,而在 js 中则称二进制数组(都是用来表示二进制数据的),要注意的是这里的二进制数组并不是真正的数组,而是类似数组的对象。(后文会提到)

存储二进制数据用到的就是ArrayBuffer,但 ArrayBuffer不能直接读写,只能存储,需要通过视图来进行操作。

例如存储二进制数据的则是 ArrayBuffer 对象,例如请求图片时,就会指定参数 responseType: 'arraybuffer'表示返回二进制数据,也就是图片数据。

ArrayBuffer也是一个构造函数,可以分配一段可以存放数据的连续内存区域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const buffer = new ArrayBuffer(8)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ArrayBuffer {
  [Uint8Contents]: <00 00 00 00 00 00 00 00>,
  byteLength: 8
}

这里的 buffer.byteLength 属性用于获取字节长度(返回 32),直接打印 buf 的结果

其中还有一个slice方法,允许将内存区域的一部分,拷贝生成一个新的ArrayBuffer对象。下面代码拷贝buffer对象的前 3 个字节(从 0 开始,到第 3 个字节前面结束)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const buffer = new ArrayBuffer(8)
const newBuffer = buffer.slice(0, 3)

除了slice方法,ArrayBuffer对象不提供任何直接读写内存的方法,只允许在其上方建立视图,然后通过视图读写。

TypedArray

不过只有空数据可没用,肯定需要操作ArrayBuffer,也就要介绍下TypedArray

ArrayBuffer对象作为内存区域,可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫做“视图”(view),ArrayBuffer有两种视图,一种是TypedArray视图,另一种是DataView视图。这里只介绍TypedArray

TypedArray视图一共包括 9 种类型,每一种视图都是一种构造函数通过 9 个构造函数,可以生成 9 种数据格式的视图,比如Uint8Array(无符号 8 位整数,表示一个字节)数组视图,具体如下

数据类型

字节长度

含义

对应的 C 语言类型

Int8

1

8 位带符号整数

signed char

Uint8

1

8 位不带符号整数

unsigned char

Uint8C

1

8 位不带符号整数(自动过滤溢出)

unsigned char

Int16

2

16 位带符号整数

short

Uint16

2

16 位不带符号整数

unsigned short

Int32

4

32 位带符号整数

int

Uint32

4

32 位不带符号的整数

unsigned int

Float32

4

32 位浮点数

float

Float64

8

64 位浮点数

double

视图的构造函数可以接受三个参数:

  • 第一个参数(必需):视图对应的底层ArrayBuffer对象。
  • 第二个参数(可选):视图开始的字节序号,默认从 0 开始。
  • 第三个参数(可选):视图包含的数据个数,默认直到本段内存区域结束。

演示

不妨给它写入字符串 abc,对应的十进制 ASCII 码为 97,98,99,由于 ASCII 码占用一个字节存储,所以这里选择 Uint8Array 用于表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const buffer = new ArrayBuffer(8);
const buf = new Uint8Array(buffer);
buf.set([97, 98, 99]);
console.log(buf.buffer);

// 输出结果
ArrayBuffer {
  [Uint8Contents]: <61 62 63 00 00 00 00 00>,
  byteLength: 8
}

可以看到 abc 确实存入了,并用十六进制的形式表示,为了验证,这里使用 NodeJS 中的 Buffer 来演示,当然也可以使用原生的TextEncoder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Buffer.from(buf.buffer).toString() // abc

你也可以直接通过数组下标的形式,来访问数据,如buf[0]返回的就是 97,但 buf 又有 length 与其他的属性方法,这种数组就统称为类数组。

buf 还有一些方法,无非就是操作字节复制,偏移就不做过多介绍与演示了,具体可查看文档

NodeJS 的 Buffer

buffer 缓冲区 | Node.js API 文档 (nodejs.cn)

在 Nodejs 中有专门的操作ArrayBuffer 的对象BufferBuffer 类是 JavaScript Uint8Array 类的子类

所以Uint8Array有的属性方法 Buffer 也有,不过 Nodejs 对 Buffer 增加了额外的方法供开发者调用。

Buffer.from

上面的代码 Buffer.from(buf.buffer).toString(),也就是将ArrayBuffer 数据转为 utf8 编码文本。其中 toString 还能转为以下编码(toString 默认 utf8)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex'

不过 Nodejs 不支持 gbk 编码,所以需要使用第三方包,如 iconv-lite

Buffer.from()有多个方法实现,第一个参数可以传入 ArrayBuffer | Uint8Array | string,如果是 string 类型,第二个参数为编码格式,例如实现编码转化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// base64
Buffer.from(str).toString('base64') // 将str转base64编码
Buffer.from(str, 'base64').toString() // 将base64编码转str

// hex
Buffer.from(str).toString('hex') // 将str转hex编码
Buffer.from(str, 'hex').toString() // 将hex编码转str

封装 Base64 编码与解码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Base64 = {
  encode: (str) => {
    return Buffer.from(str).toString('base64')
  },
  decode: (str) => {
    return Buffer.from(str, 'base64').toString()
  },
}

buf.toJSON()

将会得到 buf 的视图类型,与二进制数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// let buf = Buffer.from('abc');
let buf = Buffer.from([97, 98, 99])
console.log(buf) // <Buffer 61 62 63>

buf.toJSON() // { type: 'Buffer', data: [ 97, 98, 99 ] }
// 效果等同于 JSON.stringify(buf);

buf.values() // [ 97, 98, 99 ]   可以直接得到二进制数据

官方文档: buffer 缓冲区 | Node.js API 文档 (nodejs.cn)

ArrayBuffer 和 Buffer 区别

上述对这两者进行了介绍,这里总结一下

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区,是一个字节数组,可读但不可直接写。

Buffer 是 Node.JS 中用于操作 ArrayBuffer 的视图,继承自Uint8Array,是 TypedArray 的一种。

通俗点来说(对我而言),ArrayBuffer相当于其他语言的字节数组、字节集,但不可写,而Buffer 对象则是操作ArrayBuffer的。

应用

与二进制数据有关的地方就有应用

编码转化

将请求图片转化成 base64 编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
axios
  .get('图片url地址', {
    responseType: 'arraybuffer',
  })
  .then((res) => {
    let base64Img = res.data.toString('base64')
    console.log(base64Img)
  })

在 axios 请求图片数据的时候,指定responseType: 'arraybuffer',返回的 data 就是一个 buffer 对象。(当时写成这样的代码 Buffer.from(res.data).buffer,不过不妨碍)

http 发送二进制数据与 WebSocket

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
axios.post('http://example.com', Buffer.from('abc')).then((res) => {
  console.log(res.data)
})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let socket = new WebSocket('ws://127.0.0.1:8081')
socket.binaryType = 'arraybuffer'

// Wait until socket is open
socket.addEventListener('open', function (event) {
  // Send binary data
  const typedArray = new Uint8Array(4)
  socket.send(typedArray.buffer)
})

// Receive binary data
socket.addEventListener('message', function (event) {
  const arrayBuffer = event.data
  // ···
})

文件读写

等等。。。

参考

ArrayBuffer - ECMAScript 6 入门 (ruanyifeng.com) ArrayBuffer 和 Buffer 有何区别? - 知乎 (zhihu.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【妙趣科学】社交网络如何改变我们的友谊
美国前总统伍德罗·威尔逊说过:“友谊是令世界团结的唯一胶合剂。”一个世纪后的今天,这种胶合剂是否已经在快节奏、高科技、城市化的生活中失去了效力? 这一点可以从美国的综合社会调查中看出许多端倪。根据这项调查,在1985年至2004年之间,美国公民的好友(即有难时可以向他求助的朋友)人数从3个下降到了2个,而没有朋友可以吐露心事的人所占比例却从8%上升到了23%。在英国,独居的人数不断上升,社区的纽带也因为居民的频繁搬迁而削弱,这都造成了友谊濒临崩溃的“危机”。也有研究将社会孤立与互联网和手机联系在了一起。不过
机器人网
2018/04/19
1K0
【妙趣科学】社交网络如何改变我们的友谊
喜欢社交就去社交,不必刻意去减少|SNF 社交斋戒特写之一
“我错过了一个亿的红包呀!” 小X语速很快地说出这句话,脸上露出痛心的表情。专业年会那天晚上,群里人人发大红包,她自然也发了,却因为斋戒没法一直守在群里拼手速,所以除了自己的红包以外一个红包也没抢到。 刚刚过去的十五天对她而言有些艰难。 ——1800个好友的社交达人 收到斋戒是在一个周日晚上的七点钟,斋戒将在一个小时后开始。正在看电影的小X匆忙编辑了一条朋友圈:“我参加了一个社交网络斋戒活动,马上要进入斋戒期,每天只能用30min微信,大家可以用其他任何方式联系我。”配图用的是社交网络斋
腾讯研究院
2018/03/05
1.2K0
每天第一时间进入工作?如果做不到,那你已经“心理疾病”了。
从小到大,看过的文章无数,成功的数量不多。究其原因,不是文章写的不对,而是文章的思想与个人相结合了才能发挥应该有的效果,其效果大或小,要看当事者的能力了。
用户5997198
2020/05/12
4370
Science Advances:通过训练抑制有害思维来改善心理健康
在COVID-19大流行期间,全球各地的焦虑、创伤后压力和抑郁显著增加。患有这些疾病的人会经历令人痛苦的侵入性想法,但传统疗法经常敦促他们避免抑制自己的想法,因为侵入性可能会在强度和频率上反弹,使疾病恶化。相反,我们假设训练思维抑制会改善心理健康。来自16个国家的120名成年人接受了为期3天的在线培训,以抑制恐惧或中立的想法。恐惧的程度并没有出现矛盾的增加。相反,抑制降低了对被抑制的恐惧的记忆,使它们不那么生动和引发焦虑。训练后,参与者报告的焦虑、负面情绪和抑郁减少,后者的益处持续了3个月。高特质焦虑和与大流行相关的创伤后应激的参与者获得了最大和最持久的心理健康益处。这些发现挑战了百年来的智慧,即抑制思想是不适应的,为改善心理健康提供了一种可获得的方法。
悦影科技
2023/11/13
3210
社交网络的度中心性与协调的神经活动有关
趋同处理可能是促进社会联系的一个因素。我们使用神经成像和网络分析来调查大一学生在观看自然的视听刺激(即视频)时社交网络地位(通过度中心性测量)和神经相似性之间的联系。参与社交网络研究的学生有119名;其中63人参与了神经成像研究。我们发现,在与高级解读和社会认知相关的脑区(例如,默认模式网络),高度中心性的个体彼此间以及与同龄人之间有相似的神经反应,而低度中心性的个体表现出更多样化的反应。被试自我报告对刺激的享受程度和感兴趣程度遵循类似的模式,但这些数据并没有改变我们的主要结果。这些发现表明,对外部刺激的神经处理过程在高度中心性的个体中是相似的,但在低度中心性的个体中是特殊的。本文发表在Nature Communications杂志。
用户1279583
2022/06/13
6450
社交网络的度中心性与协调的神经活动有关
移动社交近与远
王帅帅  阿姆斯特丹大学媒介研究系博士生 最近,腾讯18周年拍摄了一个反思视频,在其中说道:我们如此接近,却又相隔甚远,网络,让你忘记了生活本来的样子。 科技正在重新切分我们的生活空间。但我们焦虑的不是社交在哪一个空间发生,而是交往方式变化后的不确定性。 手机的狂欢  移动社交正在腐蚀物理空间 在“腾讯能不能”这个视频中,有这样一个画面:回家陪老人吃饭的夫妇及其子女,坐在丰盛的饭桌面前,一脸满足地紧紧盯着自己的手机,而忙碌的父母却一脸失落。 视频中说,“我们如此接近,却又相隔甚
腾讯研究院
2018/03/05
1K0
打开大数据研究的潘多拉魔盒
关于转载授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+文章标题+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置大数据文摘二维码。 导语 近年来,大数据研究方法逐渐应用于社会学科领域,运用大规模用户数据,社科领域研究者得以从新的视角理解用户媒介使用习惯、语言、与情感。然而,在大数据研究不断普及的背景下,如何规范大数据研究的伦理准则,如何保证研究对象的隐私权,以及如何研究现有互联网公司的伦理问题,这些问题看似遥远,但是却直接影响大数据研究
大数据文摘
2018/05/22
5380
【应用】大连接-大数据下的社交网络
人类连接在一个巨大的社会网络上,我们的相互连接关系不仅仅是我们生命中与生俱来的、必不可少的一个组成部分,更是一种永恒的力量。正像大脑能够做单个神经元所不能做的事情一样,社会网络能够做的事情,仅靠一个人是无法胜任的。在现代社会,一个不争的事实是,“人际关系”多的人可以获得更优越的个人发展空间,而不擅交往的人则很容易被打入“冷宫”。我们的连接关系,并不局限于我们认识的人,朋友的朋友的朋友。也可以启动链式反应,通过互联网和全球脑,最终连接到我们需要联系的每一个人,并启动心智,形成群体智能和地球意识,使我
小莹莹
2018/04/18
1.1K0
【应用】大连接-大数据下的社交网络
社区福利赠书啦!大脑与行为∣动物们也会抑郁?
弗林特是生活于坦桑尼亚贡贝国家公园中的一只黑猩猩。当它的母亲弗罗去世时,弗林特倍受打击,显得极为伤心。它从此变得非常孤僻,常常凝视天空独自发呆;接着它又开始绝食,身体越来越虚弱。数天后,弗林特躺在母亲曾经躺过的地方,平静地追随它的母亲去了另一个世界。2010年,著名的灵长类动物学家珍妮.古道尔发表新书《透过一扇窗》,她将弗林特的故事写进了自己的书中。古道尔坚持认为,弗林特死于抑郁症。—— 本段摘自环球网(本文部分内容参考自 《大脑与行为》,北京科学技术出版社于2022年5月出版)
脑机接口社区
2022/09/22
2460
社区福利赠书啦!大脑与行为∣动物们也会抑郁?
一个产品经理的社交6问 | SNF 社交斋戒特写之二
  “我会在微博上发一些装B的话,想象十年以后我功成名就,变成张小龙那样的人,人家翻我很早之前的微博,就觉得,哦,原来那时候这个人就已经很厉害了。”笑了笑,C君再次确认:“真的是这样。”   C君,一个梦想是成为Snapchat CEO那样的90后产品经理,面对社交软件时,他有着非常专业的视角和极其独特的想法。   C君觉得对于自己来说,去体会脱离社交软件的生活,是一件很有用的事。因为从人人到QQ,从QQ到微信和微博,90后的他也算是网络原住民了。社交网络对于他们来讲是一个必然的存在,他们天然地习惯于用社交
腾讯研究院
2018/03/05
8090
大数据揭示90后爱情观,“有钱”只能排最后
导读:如今90后生活状态如何?近日,中国经济生活大调查结果公布,有些数据还是挺出乎意料的。
IT阅读排行榜
2018/08/17
3370
被追捧的“真实感”,社交平台的价值密码?
2022年第一季度,其月活用户数暴增315%,一度在美国、法国、英国、西班牙等多个地区的AppStore里排名前十,目前的累计下载量已经超过1000万,其中80%的用户年龄在16到24 岁之间。
Alter聊科技
2023/01/13
2400
你所不知道的微信(下)
腾讯研究院首席经济学家  孟昭莉 腾讯研究院高级研究员  李刚 六、微信入职场 微信已经入侵工作场景。问卷参与者中,4%的人在所有工作时间都在用微信,28%的人经常使用微信,40%的人多少会
腾讯研究院
2018/03/09
8130
你所不知道的微信(下)
Facebook:70万用户行为数据测试情绪传染
Facebook 的数据科学家在《美国国家科学院院刊》发布的一篇论文表明,人类的情绪在社交网络上具有传染性,但由于论文涉及的试验是在用户不知情的情况下篡改了其动态消息(News Feed),这也引发了不少的争议。 这项试验由 Facebook 的数据科学家 Adam Kramer 领衔,其目标是研究社交网络(积极与消极)影响的传播方式,最终他们得出的结论是,“面对面互动和非语言线索并非情绪传染的绝对必要条件。” 为了验证假设,研究者挑选了 689003 名 Facebook 用户,然后分成两组,将其中一组
大数据文摘
2018/05/21
1K0
贝尔实验室和周公“掰手腕”:AI算法解梦成为现实
上述文字描述了一位三十岁女艺术家的梦境,对于这个梦境报告,下图给出了评估结果。结果显示,这个梦境的属性是想象的、负面情绪的、男性特征的,以及有攻击性的,并被归类为噩梦(红色)。
AI科技评论
2020/09/14
8140
贝尔实验室和周公“掰手腕”:AI算法解梦成为现实
DMN默认网络:从神经环路整合视角看脑疾病中的社交功能障碍
摘要:我们的大脑,这一精妙复杂的器官,与广泛的脑部疾病紧密相连,其中社会功能障碍作为一种跨越不同诊断范畴的普遍性神经精神表现尤为显著。深入洞悉社会功能障碍背后的神经回路机制,并探寻其恢复路径,有望成为应对这些疾病治疗挑战的一项革命性、跨诊断领域的解决策略。大脑中的默认模式网络(DMN),作为社会功能的关键调节者,已被广泛证明与多种神经精神疾病紧密相关。通过对当前DMN功能认知的细致梳理,我们提出,DMN是多种社会认知与情感过程高度集成的平台。而疾病状态下,大脑区域间及网络层面的通信障碍,会严重干扰这些社会功能的顺畅整合,进而打破自我参照与注意力调控之间的微妙平衡,削弱我们适应复杂社会环境及预测未来社交互动的能力。展望未来,我们将致力于采用一种综合性的神经回路视角,系统探索社会功能障碍的神经机制。这一跨学科的努力,旨在揭示社会功能受损的根本原因,并有望为开发针对大脑疾病的新型、高效治疗策略开辟道路,为众多患者带来希望的曙光。
悦影科技
2024/09/23
4630
2021-2022 设计趋势ISUX报告·社交APP篇
前言 人是群居动物,不论以何种方式,人和人都在社交。随着环境的变化,关系链会进行更新重塑;随着年龄的变化,关系链会从广泛趋向稳定。移动互联网在悄然改变着用户的社交方式和社交需求,本文根据近一两年技术创新和用户代际更迭导致的用户需求差异化,来探索社交的设计趋势,帮助我们应对变幻莫测的互联网。 互联网社交发展方向 先来看看技术发展和现阶段人口结构的变化对线上社交有什么影响。 |技术上: 2G时代的社交实现了跨地域聊天,用户可以在QQ里和天南地北的人聊天,强调在线状态。QQ号是用户社交虚拟身份的id,是
腾讯ISUX
2021/08/19
1.1K0
独家 | 一文读懂社交网络分析-下(应用、前沿、学习资源)
本文主要阐述: 社交网络分析的应用 社交网络前沿研究 学习资料 参考资料 浏览前三章的内容请见上篇(2017年9月26日头条)。 四. 社交网络分析的应用 1. 社交推荐 社交推荐顾名思义是利用社交网络或者结合社交行为的推荐,具体表现为推荐 QQ 好友,微博根据好友关系推荐内容等。在线推荐系统最早被亚马逊用来推荐商品,如今,推荐系统在互联网已无处不在,目前大热的概念“流量分发是互联网第一入口”,支撑这个概念有两点核心,其一是内容,另外就是推荐,今日头条在短短几年间的迅速崛起便是最好的证明。 根据推荐
数据派THU
2018/01/30
2K0
独家 | 一文读懂社交网络分析-下(应用、前沿、学习资源)
AI社交将走向何方?
ChatGPT问世以来,新一轮智能革命滚滚而来。它不仅改变了人机交互的方式,还在深刻影响着各行各业,推动着各个领域的革新,所有的应用都值得用AI重做一遍,未来将会有更多的产品被重新构思和创造。社交作为互联网确定性最高、网络效应最强的赛道,将会与AI如何交汇并走向何方?
小腾资讯君
2024/12/09
2210
《哈佛幸福课》笔记
  与缺乏实质内容的心理自助行动不同,积极心理学从学术界而来,有着严谨的学术内容,并且兼顾应用到生活的方方面面,在象牙塔和大众之间构成一座桥梁。
全栈程序员站长
2022/09/09
3030
推荐阅读
相关推荐
【妙趣科学】社交网络如何改变我们的友谊
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验