JS 按自定义格式 拼接二进制串 解析二进制串|每日讯息
本文解答: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 + bitsLength
和8
的大小,就知道我们需要关注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。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这个专栏里分享:《教你做小游戏》。
标签:
-
2023-04-23 20:38:47
JS 按自定义格式 拼接二进制串 解析二进制串|每日讯息<
那么你可以规定这种自定义格式的二进制串:dddddddccccbaaaa其中dcba都是代表0或1,我们用最后4位(aaaa)
-
2023-04-23 20:02:04
多玩魔兽插件安装路径_多玩魔兽插件_看热讯<
1、魔兽世界文件名字为:worldofwarcraft,则插件应该放在WorldofWarcraftInterf
-
2023-04-23 19:56:33
梅西下家概率公布!瓜帅无情曼城靠后,第二热度极高,第一无悬念<
瓜帅并没有和曼城提过想要签约梅西的事情,曼城也没有为梅西送上过任何的报价。所以曼城在梅西下家排行榜上
-
2023-04-23 19:06:56
新款林肯冒险家与新宝马X1同登上海车展,谁更强一筹<
就在4月18号开幕的上海国际车展上,众多国内外汽车品牌参展,本次阵容可谓是空前强大,其中两家豪华品牌林
-
2023-04-23 18:48:52
杜星霖个人资料年龄_杜星霖简单介绍<
欢迎观看本篇文章,小柴来为大家解答以上问题。杜星霖个人资料年龄,杜星霖简单介绍很多人还不知道,现在让
-
2023-04-23 20:38:47
JS 按自定义格式 拼接二进制串 解析二进制串|每日讯息
那么你可以规定这种自定义格式的二进制串:dddddddccccbaaaa其中dcba都是代表0或1,我们用最后4位(aaaa)
-
2023-04-23 20:02:04
多玩魔兽插件安装路径_多玩魔兽插件_看热讯
1、魔兽世界文件名字为:worldofwarcraft,则插件应该放在WorldofWarcraftInterf
-
2023-04-23 19:56:33
梅西下家概率公布!瓜帅无情曼城靠后,第二热度极高,第一无悬念
瓜帅并没有和曼城提过想要签约梅西的事情,曼城也没有为梅西送上过任何的报价。所以曼城在梅西下家排行榜上
-
2023-04-23 19:06:56
新款林肯冒险家与新宝马X1同登上海车展,谁更强一筹
就在4月18号开幕的上海国际车展上,众多国内外汽车品牌参展,本次阵容可谓是空前强大,其中两家豪华品牌林
-
2023-04-23 18:48:52
杜星霖个人资料年龄_杜星霖简单介绍
欢迎观看本篇文章,小柴来为大家解答以上问题。杜星霖个人资料年龄,杜星霖简单介绍很多人还不知道,现在让
-
2023-04-23 18:28:15
同比增长60.3%!南京加快建成船载危险货物安全监管“江苏模式”南京示范区 当前速递
龙虎网讯(通讯员周添畅)近年来,南京海事局坚持以“高标准、严选船、智管控”的船载危险货物安全监管“江
-
2023-04-23 18:09:00
今日关注:南京求真中学官网首页_南京求真中学官网
1、一般跟着招生简章一起出,就是招生目录,上面会写着招生人数,报考条件、科目、参考书籍等信息。2、根据
-
2023-04-23 17:38:40
国内输送容量最大、输电距离最长的陆上220kV电缆线路工程在南京开工 实时焦点
近日,南京秋藤-望江220kV线路工程在南京市江心洲举行线路开工仪式,标志着工程全面启动。据了解,秋藤-望
-
2023-04-23 17:27:27
今日播报!昆明普瑞眼科15周年庆暨近视矫正成果展示活动圆满落幕
4月22日,昆明普瑞眼科医院在五华区龙泉路院区举办15周年庆启动暨近视手术成果发布活动,会上发布了《云南
-
2023-04-23 16:52:55
福建省屏南县发布雷电黄色预警
屏南县气象台2023年04月23日14时26分发布雷电黄色预警信号:预计未来6小时内我县有雷电活动,雷雨时局地伴
-
2023-04-23 16:44:26
当前看点!有效投资为高质量发展添动力
一季度,资本形成总额对经济增长贡献率为34 7%,拉动GDP增长1 6个百分点。投资较快增长为我国经济平稳运行
-
2023-04-23 16:08:10
晶科能源:预计2023年1-3月盈利,净利润同比增298.89%至323.82%
晶科能源发布业绩预告,预计2023年1-3月归属净利润盈利16亿元至17亿元,同比上年增298 89%至323 82%。
-
2023-04-23 15:57:05
全球要闻:大语言模型中的涌现现象是不是伪科学?
Datawhale干货作者:平凡@知乎,诺桑比亚大学,在读博士今天晚上,花了一点儿时间看了两篇文章:《Emergent
-
2023-04-23 15:12:16
员工自购情况出炉 权益大厂中欧基金这些产品最受“内部人”欢迎
公募基金行业进入“万基时代”,知名基金公司内部员工持基情况成为不少投资者参考之一,随着2022年基金年报
-
2023-04-23 14:58:37
一汽奔腾发布全新MPV,奔腾M9售价22.98万元起
4月18日,上海国际车展盛大开幕,作为国际顶级车展,国内外知名汽车品牌携全新产品以高规格参展。奔腾M9作
-
2023-04-23 14:34:56
六月份适合去哪里旅游地方_六月份适合去哪里旅游_热点聚焦
1、比较有特色的旅游目的地是福建,可以去武夷山游玩,无论那天天气如何,是晴是雨,都会有美好的回忆,那
-
2023-04-23 14:08:54
《长月烬明》破《苍兰诀》的记录,但为何它却没《苍兰诀》火呢?|关注
《长月烬明》破《苍兰诀》的记录,但为何它却没《苍兰诀》火呢?
-
2023-04-23 13:28:49
热头条丨防止玻璃浑浊的最佳洗碗机清洁剂_圣诞节要送礼物给女朋友吗
醋可以去除眼镜上的浑浊残留物。洗碗机让我们许多人的生活变得更轻松。许多人认为使用洗碗机洗碗比用手洗更
-
2023-04-23 13:28:20
征集令丨 “上美海湾 聚焦光彩”海湾旅游区2023年度行摄活动暨影像征集大赛火热开启
为从不同角度展现“上美海湾”之美,用最美瞬间展现海湾旅游区美好生活,持续擦亮“上美海湾”的地区品牌名
-
2023-04-23 13:24:31
新闻调查丨渔民心中的“港湾银行” 红树林守护一片绿水青山 环球热议
曾经率先种植红树的西门岛,已经成为海洋特别保护区,并从2013年开始在滩涂营造红树林,截至目前面积达到20
-
2023-04-23 12:28:15
天天观焦点:江苏金租2022年营收同比增长10.29% 净利同比增长16.36%
资产方面,截至2022年末,江苏金租资产总规模1089 92亿元,比上年末增加96 84亿元,增长9 75%。其中,融资
-
2023-04-23 12:13:49
山西证券:给予兴业证券增持评级
山西证券股份有限公司刘丽,孙田田近期对兴业证券(601377)进行研究并发布了研究报告《自营拖累业绩,未来预期向好》,本报告对兴业证券给出增持
-
2023-04-23 11:41:45
vivo Y78+开启预售,3D双曲屏1599元起即可入手_天天热点
4月23日,vivo官网上架了Y系列全新产品vivoY78+。vivoY78+共有天青色、暖阳金、月影黑三个配色,8GB+128GB版本售价1599元、8GB+256GB版本售价1
-
2023-04-23 11:15:47
“五一”假期国内游线上订单已基本追平2019年同期水平——旅游业复苏渐入佳境
自今年元旦、春节假期旅游市场实现“开门红”后,高开稳增态势一直延续,“五一”假期有望为旅游市场复苏再添一把火。
-
2023-04-23 11:29:31
央行曝光!2家公司被罚!|当前简讯
近年来,中国人民银行持续推进整治拒收人民币现金工作,对核实为拒收人民币现金的,中国人民银行依法处罚并予以曝光,切实保护消费者的合法权
-
2023-04-23 10:50:42
邢台市清河县妇幼保健院开展“走社区 送健康 暖民心”宣教义诊活动|速递
河北新闻网讯(智慧娟、张志华)为提高妇女儿童的健康水平和生活质量,加强产前筛查、防控出生缺陷、落实民生工程,进一步推动基
-
2023-04-23 10:30:03
视点!行银易贷逾期24小时还有危险吗
需要视情况而定。起诉后,法院判决还款不执行的,那法院就会采取强制执行。行动建议:1)正规网贷一定要还。蚂蚁花呗借呗、京东白条金条等都是
-
2023-04-23 09:57:30
图集丨四川凉山西昌的专属浪漫 蓝花楹在城区开成了紫色花海
图集丨四川凉山西昌的专属浪漫蓝花楹在城区开成了紫色花海蓝花楹点缀着春日好风光封面新闻记者罗石芊徐湘东摄影报道每年4月的中下旬,是四川凉
-
2023-04-23 09:41:40
世界最资讯丨天源环保董秘回复:公司2022年度利润分配计划为每10股派发现金红利0.5元(含税)
天源环保(301127)04月23日在投资者关系平台上答复了投资者关心的问题。
-
2023-04-23 09:17:06
海南白沙喜过民族传统节日“三月三” 民俗活动花样多-天天短讯
中新网海南新闻4月22日电(张月和)4月22日是农历三月初三,亦称“上巳节”,是中华民族的传统节日。在海南省白沙黎族自治县,这一天,男女老...