最新要闻
- Consul 的架构和设计思路
- 勇士126-125国王!可怕的不是季后赛2连胜,而是库里赛后的这番话
- 三国志战略版SP袁绍怎么样 三国志战略版sp袁绍厉害吗_全球热头条
- 广东队止步8强,这会是易建联职业生涯的最后一战吗?
- 现代中国文化与文学 第23辑_关于现代中国文化与文学 第23辑介绍
- 手机打码赚钱正规网站_手机打码赚钱
- 三晋春耕忙执法护好航-天天时讯
- 世界快资讯丨今年江西将新增50家社区嵌入式养老院
- 为什么要有敬业精神?九年级政治_为什么要有敬业精神
- 助力推行“稻-稻-油”种植模式 作物也有“成长日记”了 当前聚焦
- 天天快资讯丨安信证券给予新和成买入评级 目标价格为23.72元
- 海淀区图书馆(北馆)发布9项年度阅读计划_天天报道
- 文件已损坏或丢失tenrpcs.dll(tersafe dll文件损坏怎么修复)|天天快看
- 信息:三张“地图”发挥大作用,帮助人大代表有效参与基层治理
- 天天热消息:拍卖房屋的税费由谁承担
- 世界头条:令狐楚拼音_令狐楚
5G
首例5g乳腺手术价格是多少钱?首例5g乳腺手术成功率是多少?
电信光纤多少钱一年?电信光纤价格表
- 首例5g乳腺手术价格是多少钱?首例5g乳腺手术成功率是多少?
- 电信光纤多少钱一年?电信光纤价格表
- 5g流量消耗会不会很快?手机打开5g好还是关闭5G好?
- 5g怎么变成4g信号?5g手机排名前十名一览
- 5g和4g的区别在哪里?5g首批城市名单
- 5g是谁最先研发出来的?5g是什么意思?
科技
天天观热点: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。喜欢可以关注我噢~我有空了会分享做游戏的相关技术,会在这个专栏里分享:《教你做小游戏》。
关键词:
天天观热点:JS 按自定义格式 拼接二进制串 解析二进制串
Consul 的架构和设计思路
【国际锐评】世界地球日 太平洋不该成为日本排污的垃圾场
当前滚动:追梦主动替补!库里:我替补过&维金斯替补过 我们做一切就为赢
勇士126-125国王!可怕的不是季后赛2连胜,而是库里赛后的这番话
多个开奖球卡在出口遭质疑
座椅和坐椅有什么区别 座椅还是坐椅
三国志战略版SP袁绍怎么样 三国志战略版sp袁绍厉害吗_全球热头条
环球速讯:大族激光4月24日开盘跌幅达5%
2023,贝参药业携手善医美多维赋能第三终端攻克咳喘_焦点消息
全球速讯:科技助力海尔·2023青岛马拉松,盈康一生领跑健康新赛道
天天热议:世界读书日 澳门书香满城
广东队止步8强,这会是易建联职业生涯的最后一战吗?
从非机动车道进入路口 没有划分机动车道非机动车道和人行道的机动车在道路中间通行 当前速看
马力刺客|混动车上马力机 被刺竟是我自己 快资讯
郎酒核心阵地遭茅台挑战,上市之路再生变数?
现代中国文学作家_关于现代中国文学作家介绍|世界速讯
现代中国文化与文学 第23辑_关于现代中国文化与文学 第23辑介绍
西北油田开展技术攻坚破解原油处理难题
今日热闻!请问空调自动停机是什么原因_停机的原因
热点在线丨滴滴出行如何付款图解_滴滴出行如何付款
手机打码赚钱正规网站_手机打码赚钱
当前信息:千金药业:子公司化学原料药阿哌沙班获上市申请批准通知书
我们的青春,绽放在田野与乡间——全国“两红两优”风采录之一_焦点速讯
三晋春耕忙执法护好航-天天时讯
西甲-巴萨1-0马竞11分领跑 费兰破门莱万失单刀 全球消息
江西省产业数字化“千人入万企”行动启动
世界快资讯丨今年江西将新增50家社区嵌入式养老院
无锡攻略二日游_无锡旅游攻略二日游-世界即时看
矮丘乙郎
天天日报丨丰田沙漠王子越野车图片_丰田沙漠王子
民间小故事短篇300字_民间小故事
为什么要有敬业精神?九年级政治_为什么要有敬业精神
批量修改文件扩展名 头条焦点
【环球新要闻】江西九江:“板凳会”上听民声
助力推行“稻-稻-油”种植模式 作物也有“成长日记”了 当前聚焦
肖邦简介资料 肖邦简介
全球热资讯!gucci钱包的序列号在哪里_gucci钱包
20岁内蒙古飞人连创新高已成顶流健将 一项目水平国内或仅在谢震业之下
多家A股上市公司谋划布局6G
天天快资讯丨安信证券给予新和成买入评级 目标价格为23.72元
宁德时代(300750):Q1业绩超预期,新技术落地巩固长期竞争力_焦点播报
天天看点:国红龙谕走进友邦 共建中国高净值人群“品质生态圈”
你选书,我买单!长沙理工大学为学生“量身定书”
海淀区图书馆(北馆)发布9项年度阅读计划_天天报道
斯蒂芬·金斯利_关于斯蒂芬·金斯利简介|世界速递
焦点!不是是什么意思网络用语(bushi是什么梗)
今日为什么方浩电竞平台进入魔兽后看不到房间?
文件已损坏或丢失tenrpcs.dll(tersafe dll文件损坏怎么修复)|天天快看
世界今日报丨半条命2百度百科(疯狂互动半条命前传2)
现代家训有哪些?_现代家训有哪些-全球报资讯
杨高南路改建工程又有新进展!华夏西路跨线桥拼宽段投入使用 当前视点
信息:三张“地图”发挥大作用,帮助人大代表有效参与基层治理
快看点丨【上饶天下SHOW之广信区】中国开采年代最早、开采时间最长岩金矿遗址在上饶!
盗窃钱财多少钱够判刑-焦点快报
世界讯息:寻衅滋事一般会怎么判
天天热消息:拍卖房屋的税费由谁承担
期刊大赠送、雕版拓印体验……海南省图书馆开展“世界读书日”系列活动
网络安全技术与应用官网_网络安全技术与应用
【播资讯】东西南北中党政军民学是什么意思_东西南北中
世界头条:令狐楚拼音_令狐楚
环球焦点!x64dbg_x64
上期所拟修订结算细则
杨恒坤被查!_世界视点
天天观点:“倍轻松”不轻松!上市第二年就巨亏了
中国石油管道局工程有限公司签署 EPC 总承包合同,项目途经乌干达、坦桑尼亚两国
南县市场监管局与行业协会座谈共谋高质量发展_全球微头条
我国首个大型页岩气田“气油并进” 页岩油产量突破2万吨
嘉兴金庸图书馆将拆除?官方最新通报_全球速讯
上海交通大学博士李思晨:文创科创结合 打造郑州文化名片
共话中国经济新机遇丨丰田:在中国市场的表现对引领公司转型非常重要-天天观天下
101-96!广厦险胜广东晋级四强!孙铭徽关键三分立功,胡金秋22分
孙铭徽23分投中关键三分!广厦客场淘汰广东,杀进季后赛四强-前沿资讯
美团广东汕头外卖骑手陷停工争端 单价下降所致?|当前通讯
环球快播:葡萄风信的种植养护及注意事项
新资讯:紫建电子去年营收9.22亿 净利润4183万
读书之美丨阅读的力量
今日热门!当事人,吉安中院诉讼费微信缴费功能上线啦!
阿莱德:2022年净利润7426.98万元,同比增长5.79%
世界热消息:热搜第一!他被拒录公务员,官方回应!
苏州一公司要求员工更换宝马车为国产品牌车,律师:涉嫌违法
物理考研历年真题题库视频网课复习资料
[绯染天空]曾经的回忆,向未来前进的自己
《缇可》个人续作 热消息
环球热议:生意宝与杭钢电商战略合作,角逐6500亿钢铁电商市场
替换人生_替换-环球新资讯
焦点简讯:2022年报掘金丨这家中药创新药龙头年内股价涨超66%!一季度业绩延续向上趋势,多款独家医保品种有望受益新版基药目录调整(附2股)
传统文化的青年力量!北京高校大学生举办京剧清音会-每日观点
portlocker是什么意思_portlocker
pdf excel相互转换_PDF EXCEL 焦点热闻
央财考研_央财 全球实时
因分支机构基金销售负责人无从业资格 大连银行被责令改正
次新基金平均股票仓位水平上移 稳健分步建仓策略为主
视焦点讯!一博科技2023年第一季度营收1.77亿推广费投入同比有较大提升
微信名铿锵玫瑰是什么意思_铿锵玫瑰是什么意思|当前资讯
今年“五一”假期出行需求旺盛 铁路部门多措并举满足旅客出行需求
人民海军成立74周年|岸导部队军营开放 主战装备纷纷亮相
大国基理|重庆铜梁:一条有着“亲民招牌”的社区路
快讯:有效投资为高质量发展添动力
“五个一百”:激扬网络正能量 聚力奋进新征程 世界通讯