品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

JS 按自定义格式 拼接二进制串 解析二进制串 世界热推荐

2023-04-24 04:35:38 来源:腾讯云

本文解答:JS如何按自定义格式拼接二进制串?如何解析二进制串?

什么是二进制串?

当你要存一些数据时,可以用自定义格式存下来,这样最节约空间。

例如,你想存这些数据:


(资料图片仅供参考)

ID(范围0-16)是否VIP(范围0-1)星座(范围0-11)年龄(范围0-127)

那么你可以规定这种自定义格式的二进制串:dddddddc cccbaaaa其中d c b a都是代表0或1,我们用最后4位(aaaa)表示“ID”,用b表示“是否VIP”,用ccc表示“星座”,用dddd表示年龄。

本来你可能会用uint32的数组来存这些,占4*32=128位,但是现在,我们只用了16位,2个uint8就存下了。非常节约存储空间。这就是一种自定义格式的二进制串。

注意:当今存储确实不贵,但是如果你希望把信息存放到URL中,那么你的空间越小,URL就越短。这时候价值就非常大了。例如我之前开发象棋小游戏,把棋局信息(包括当前棋盘状态、所有回合操作记录)都存到了URL中,就能非常方便的保存、分享游戏对局,方便大家复盘。详见文章《保存象棋棋盘信息,需要多少比特?我只用139-167位二进制》

在JS中,对应的数据类型是Uint8Array。

拼接自定义格式二进制串

function concatBits(current: number, offset: number, bits: number, bitsLength: number) {  let newCurrent = current;  let newOffset = offset;  const newUint8: number[] = [];  if (offset + bitsLength < 8) {    newCurrent |= bits << (8 - bitsLength - offset);    newOffset += bitsLength;  } else if (offset + bitsLength === 8) {    newUint8.push(current | bits);    newCurrent = 0;    newOffset = 0;  } else {    newCurrent |= bits >> (offset - 8 + bitsLength);    newUint8.push(newCurrent);    newCurrent = (bits << (16 - offset - bitsLength)) & 0xff;    newOffset = offset - 8 + bitsLength;  }  return [newCurrent, newOffset, newUint8];}

当然这还是有个限制:bitsLength必须小于等于8。如果超过8,可能一个bits要覆盖3个uint8,这种情况没考虑在内。

如果你需要拓展,欢迎继续完善它!

解析自定义格式二进制串

function readBits(array: Uint8Array, bitsOffset: number, bitsLength: number) {  const offset = bitsOffset % 8;  const index = Math.floor(bitsOffset / 8);  if ((offset + bitsLength > 8 && index + 1 >= array.length) || offset + bitsLength <= 8 && index >= array.length) {    throw new Error("readBitsError");  }  let number = offset + bitsLength <= 8 ? array[index] : (array[index] << 8) | array[index + 1];  const length = offset + bitsLength <= 8 ? 8 : 16;  number >>= (length - bitsLength - offset);  number &= ([0, 1, 3, 7, 15, 31, 63][bitsLength]);  return [number, bitsOffset + bitsLength];}

decode难点

相比encode,decode其实是更难的事情。

因为encode时,你只需要无脑往一个字节串后面补充就好。而decode需要你非常清楚,每一位的作用,并理解他们的含义。你需要有高超的位运算技巧,才能轻易完成。

如何知道一共有多少项目

设计数据结构时,我们没有把项目数作为一个变量,所以数组长度是未知的。

也就是说,我们必须不断循环,直到这个字节串没有内容了,我们就终止。

如何读取制定长度bit位的内容

我们封装一个函数readBits,用于读取某个字节串,从第x位开始、长度为n的内容。

因此,需要3个参数:

字节串array位偏移量bitsOffset要读取的长度bitsLength

返回值主要是对应的内容(可以用一个uint8来表示),此外,读取后还需要更新一下调用者的位偏移量bitsOffset,方便持续调用,所以我们顺便把新的位偏移量bitsOffset返回,作为返回值第二项。

解释

在本文场景下,要读取的长度bitsLength不超过8,所以我们要关注的数据量,只会来自1个uint8或者某连续2个uint8。

计算index就是为了判断第一个关键的uint8的位置。

计算offset,知道应该从index的第几位开始算数。

然后通过比较offset + bitsLength8的大小,就知道我们需要关注1个uint8即可、还是需要关注连续2个uint8。

我们把需要关注的uint8赋值给number,用length表示我们关注8位还是16位。

例如number二进制是10110000,我们需要取从2开始的长度为2的内容(即11)。该怎么做呢?

只需要把它右移4位(用于删除不需要的后缀),再跟二进制11做个与操作(用于删除不需要的前缀),即可。

因此代码会这样写:number >>= (length - bitsLength - offset);number &= ([0, 1, 3, 7, 15, 31, 63][bitsLength]);

其中0 1 3 7 15 31 63,对应二进制分别是0 1 11 111 1111 11111 111111。都是为了删除前缀。

这里因为我需要的bitsLength有限,所以我用这种方式偷懒了。如果你要做的更通用,可能要这样写:2 ** bitsLength - 1,目的是获取位长度为bitsLength的全是1的数字,用于删除number不需要的前缀。

readBits开发完毕,以后可以这样调用:

let current;let bitsOffset = 0;[current, bitsOffset] = readBits(array, bitsOffset, 4);

这会读取字节串array的从第0位开始、长度为4个bit位的内容,赋值给current变量。

写在最后

我是HullQin,公众号线下聚会游戏的作者(欢迎关注我,交个朋友)。转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩UNO、飞行棋、斗地主、五子棋、一夜狼、狼人杀、象棋、德国心脏病、达芬奇密码等游戏,不收费无广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这个专栏里分享:《教你做小游戏》。

标签:

(责任编辑:)

相关文章

JS 按自定义格式 拼接二进制串 解析二进制串 世界热推荐

​那么你可以规定这种自定义格式的二进制串:dddddddccccbaaaa其中dcba都是代表0或1,我们用最后4位(aaaa)

2023-04-24 04:35:38

欧美漫游录_世界快看

​1、《欧美漫游录》是2013年网路与书出版的图书。2、作者是吕碧城。

2023-04-24 02:15:33

读书之美丨阅读的力量_天天快资讯

​你有多久,没有翻开一本书了也许是没有了曾经读书时的心境也许是被生活的洪流推着忘记了手边的书我相信你是

2023-04-23 23:59:09

麝香保心丸和复方丹参滴丸能一起吃吗(麝香保心丸和复方丹参滴丸)

​1、1 麝香保心丸是属于芳香温通类药物,而复方丹参滴丸属于活血化瘀类药物,重点是一个作用于“脉”一个作

2023-04-23 23:53:11

环球要闻:团结故事300字_团结故事

​1、最低0 27元开通文库会员,查看完整内容>原发布者:qwe3820750搞好各部门之间协调、配合,建设一支敬

2023-04-23 22:53:43

每日快播:书香满城!扬州举办“邮悦读书节”暨换书活动

​4月23日是“世界图书日”。当天,由扬州市全民阅读办、市文广旅局、市教育局、市总工会、共青团扬州市委、

2023-04-23 22:36:40

辣椒植物的最低温度

​生长在庭院里的胡椒辣椒(Capsicumannuum),包括甜辣椒和辣辣椒,在任何具有足够长生长季节且夜间温度高于华氏

2023-04-23 21:29:29

当前播报:《归路》番外25:归晓的春梦男主,被路炎晨发现,放心大胆摸

​本文根据电视剧《归路》续写故事,纯属玲珑原创,谢绝抄袭,转载。如有侵权,联系删除。没看过番外1-24的,

2023-04-23 21:13:56

【全球热闻】杜兰特:快船少了两位关键球员 但依旧不能小看&他们永不言弃

​杜兰特:快船少了两位关键球员但依旧不能小看&他们永不言弃,快船队,永不言弃,美国篮球,凯文杜兰特,凯文·杜

2023-04-23 20:59:32

每日精选:巴西学者华一卿:巴中未来合作前景广阔| 世界观

​全球化智库(CCG)特邀高级研究员、复旦大学巴西籍学者华一卿(KarinCostaVazquez)近日接受中新网专访时表示,

2023-04-23 18:47:11

B站两公司被爱奇艺起诉 案由均为侵权纠纷_环球今亮点

​科技讯4月23日消息,据天眼查App显示,近日,北京爱奇艺科技有限公司新增两则开庭公告,被告分别为上海宽娱

2023-04-23 17:52:01

热讯:百香果蜂蜜柠檬茶的做法视频窍门_百香果蜂蜜柠檬茶的做法

​你们好,最近小活发现有诸多的小伙伴们对于百香果蜂蜜柠檬茶的做法视频窍门,百香果蜂蜜柠檬茶的做法这个问

2023-04-23 17:41:31

寄文件到马来西亚最快的快递是哪家_最快的快递是哪家

​1、速度最快的快递;在国内的快递单位中,还是属顺丰快递是最快的。2、因为顺风快递有一套对快递递运,快递

2023-04-23 17:15:45

山东加强基层物业服务 以“小切口”推进“大民生” 天天滚动

​(记者沙见龙)平整的道路、有序的车位、整洁的环境……走进山东潍坊安丘市复烤厂家属院,焕然一新的小区景象

2023-04-23 16:59:23

京东入手vivo Y78+,限时抽取千元旅行基金

​4月23日,vivoY78+开启了全网预售,8GB+128GB版本售价1599元。这次vivoY78+的设计绝对是一个亮点,根据vivo

2023-04-23 16:24:20

25000人!用脚步丈量“最美青岛”_世界聚焦

​用脚步丈量“最美青岛”。2023青岛马拉松今天鸣枪开跑啦。以起点五四广场为轴,西至八大峡广场,东至石老人

2023-04-23 16:28:31

电脑自动关机在哪里设置-电脑定时关机怎么设置win10

​1、Win10系统设置电脑定时关机的方法:在开始菜单的搜索栏中输入“计划任务”,系统自动搜索到计划任务程序

2023-04-23 15:48:18

打造特色读书活动!图书集市带火文化消费

​在世界读书日期间,铛铛车由旅游观光车升级为童乐书屋,通过趣味故事会的形式,拓展孩子们的阅读空间。在浙

2023-04-23 15:45:39

每日速递:“东辽柞蚕”添喜讯,特色产业促振兴

​4月14日,作为东辽县优势特色产业、生态农业之一的“东辽柞蚕”拥有了“新身份”,国家知识产权局认定“东

2023-04-23 14:48:40

世界实时:一季度我国船舶工业三项指标世界第一

​记者从工业和信息化部了解到,今年一季度,我国船舶工业运行企稳回升,多项指标居世界第一。不久前,中国船

2023-04-23 14:31:22

新茶如何保存 新茶怎么保存 热点评

​1、首先,茶叶的包装材料要求无异味,并且还要有良好的防潮性能。同时,盛放茶叶的容器必需是可以密封的,

2023-04-23 14:12:31

4月25日长沙县妇幼保健院hpv疫苗预约方式-世界看点

​长沙县妇幼保健院将在4月25日直播课程中开展hpv疫苗线上预约,欢迎有需要的小姐姐参与哦!以下是预约方式:

2023-04-23 13:28:51

深圳欢乐谷蹦极多少米_深圳那里可以蹦极_世界观热点

​1、深圳小梅沙度假村的海滨岩石处途经公交车:103B、364380A、380B、387、M207、M362,停靠公交

2023-04-23 13:11:01

每日热文:每日商业资讯

​重庆IFS打造多巴胺热练场呈现西南独家“全国制霸——SLAMDUNK快闪空间”即日起,重庆IFS打造的全新运动主题

2023-04-23 12:47:09

五倍子蜂蜜_五倍子蜂蜜的功效与作用|世界简讯

​1、五倍子蜂蜜其实这是属于中药的蜂蜜,主要是采集的五倍子的花蜜。2、这种蜂蜜是可以起到清热解毒和杀菌的

2023-04-23 12:10:14

每日消息!钟薛高“少年”雪糕系列上新,主打低糖低脂特色

​新京报讯(首席记者郭铁)新京报记者从钟薛高方面获悉,其与国家奥林匹克体育中心联合研发的“少年”雪糕系

2023-04-23 12:06:24

拜登:美国政府人员已撤出苏丹喀土穆,美使馆暂停运作

​据美国白宫网站,美国总统拜登4月22日就苏丹局势发表声明称,根据其下达的指示,美国军方22日将美国政府人

2023-04-23 11:58:15

戈壁滩上建设施农业基地

​春日里,走进新疆阿克苏市阿依库勒镇“千亩万吨”戈壁设施农业基地,一派生机盎然,西红柿等果蔬长势良好。

2023-04-23 11:25:07

广西壮族自治区钦州市2023-04-23 08:09发布雷电黄色预警

​一、广西壮族自治区钦州市天气预报1、钦州市气象台2023年4月23日8时8分发布雷电黄色预警信号。2、目前防城

2023-04-23 10:54:53

今日视点:首都广播电视节目制作业协会年会举行

​中国青年报客户端讯(中青报·中青网记者沈杰群)日前,首都广播电视节目制作业协会年会在2023首都电视节目

2023-04-23 10:39:01