91在线视频播放_欧美日韩精品一区二区_2020国产成人精品免费视频_国产嫩草影院

您的位置:首頁 >熱點 > 正文

世界通訊!JS 按自定義格式 拼接二進(jìn)制串 解析二進(jìn)制串

本文解答:JS如何按自定義格式拼接二進(jìn)制串?如何解析二進(jìn)制串?

什么是二進(jìn)制串?

當(dāng)你要存一些數(shù)據(jù)時,可以用自定義格式存下來,這樣最節(jié)約空間。


(資料圖片)

例如,你想存這些數(shù)據(jù):

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

那么你可以規(guī)定這種自定義格式的二進(jìn)制串:dddddddc cccbaaaa其中d c b a都是代表0或1,我們用最后4位(aaaa)表示“ID”,用b表示“是否VIP”,用ccc表示“星座”,用dddd表示年齡。

本來你可能會用uint32的數(shù)組來存這些,占4*32=128位,但是現(xiàn)在,我們只用了16位,2個uint8就存下了。非常節(jié)約存儲空間。這就是一種自定義格式的二進(jìn)制串。

注意:當(dāng)今存儲確實不貴,但是如果你希望把信息存放到URL中,那么你的空間越小,URL就越短。這時候價值就非常大了。例如我之前開發(fā)象棋小游戲,把棋局信息(包括當(dāng)前棋盤狀態(tài)、所有回合操作記錄)都存到了URL中,就能非常方便的保存、分享游戲?qū)郑奖愦蠹覐?fù)盤。詳見文章《保存象棋棋盤信息,需要多少比特?我只用139-167位二進(jìn)制》

在JS中,對應(yīng)的數(shù)據(jù)類型是Uint8Array。

拼接自定義格式二進(jìn)制串

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];}

當(dāng)然這還是有個限制:bitsLength必須小于等于8。如果超過8,可能一個bits要覆蓋3個uint8,這種情況沒考慮在內(nèi)。

如果你需要拓展,歡迎繼續(xù)完善它!

解析自定義格式二進(jìn)制串

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時,你只需要無腦往一個字節(jié)串后面補(bǔ)充就好。而decode需要你非常清楚,每一位的作用,并理解他們的含義。你需要有高超的位運(yùn)算技巧,才能輕易完成。

如何知道一共有多少項目

設(shè)計數(shù)據(jù)結(jié)構(gòu)時,我們沒有把項目數(shù)作為一個變量,所以數(shù)組長度是未知的。

也就是說,我們必須不斷循環(huán),直到這個字節(jié)串沒有內(nèi)容了,我們就終止。

如何讀取制定長度bit位的內(nèi)容

我們封裝一個函數(shù)readBits,用于讀取某個字節(jié)串,從第x位開始、長度為n的內(nèi)容。

因此,需要3個參數(shù):

字節(jié)串array位偏移量bitsOffset要讀取的長度bitsLength

返回值主要是對應(yīng)的內(nèi)容(可以用一個uint8來表示),此外,讀取后還需要更新一下調(diào)用者的位偏移量bitsOffset,方便持續(xù)調(diào)用,所以我們順便把新的位偏移量bitsOffset返回,作為返回值第二項。

解釋

在本文場景下,要讀取的長度bitsLength不超過8,所以我們要關(guān)注的數(shù)據(jù)量,只會來自1個uint8或者某連續(xù)2個uint8。

計算index就是為了判斷第一個關(guān)鍵的uint8的位置。

計算offset,知道應(yīng)該從index的第幾位開始算數(shù)。

然后通過比較offset + bitsLength8的大小,就知道我們需要關(guān)注1個uint8即可、還是需要關(guān)注連續(xù)2個uint8。

我們把需要關(guān)注的uint8賦值給number,用length表示我們關(guān)注8位還是16位。

例如number二進(jìn)制是10110000,我們需要取從2開始的長度為2的內(nèi)容(即11)。該怎么做呢?

只需要把它右移4位(用于刪除不需要的后綴),再跟二進(jìn)制11做個與操作(用于刪除不需要的前綴),即可。

因此代碼會這樣寫:number >>= (length - bitsLength - offset);number &= ([0, 1, 3, 7, 15, 31, 63][bitsLength]);

其中0 1 3 7 15 31 63,對應(yīng)二進(jìn)制分別是0 1 11 111 1111 11111 111111。都是為了刪除前綴。

這里因為我需要的bitsLength有限,所以我用這種方式偷懶了。如果你要做的更通用,可能要這樣寫:2 ** bitsLength - 1,目的是獲取位長度為bitsLength的全是1的數(shù)字,用于刪除number不需要的前綴。

readBits開發(fā)完畢,以后可以這樣調(diào)用:

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

這會讀取字節(jié)串a(chǎn)rray的從第0位開始、長度為4個bit位的內(nèi)容,賦值給current變量。

寫在最后

我是HullQin,公眾號線下聚會游戲的作者(歡迎關(guān)注我,交個朋友)。轉(zhuǎn)發(fā)本文前需獲得作者HullQin授權(quán)。我獨立開發(fā)了《聯(lián)機(jī)桌游合集》,是個網(wǎng)頁,可以很方便的跟朋友聯(lián)機(jī)玩UNO、飛行棋、斗地主、五子棋、一夜狼、狼人殺、象棋、德國心臟病、達(dá)芬奇密碼等游戲,不收費無廣告。還開發(fā)了《Dice Crush》參加Game Jam 2022。喜歡可以關(guān)注我噢~我有空了會分享做游戲的相關(guān)技術(shù),會在這個專欄里分享:《教你做小游戲》。

免責(zé)聲明:本文不構(gòu)成任何商業(yè)建議,投資有風(fēng)險,選擇需謹(jǐn)慎!本站發(fā)布的圖文一切為分享交流,傳播正能量,此文不保證數(shù)據(jù)的準(zhǔn)確性,內(nèi)容僅供參考

關(guān)鍵詞:

相關(guān)內(nèi)容

熱門資訊

91在线视频播放_欧美日韩精品一区二区_2020国产成人精品免费视频_国产嫩草影院

            鲁一鲁一鲁一鲁一av| 日韩视频第二页| 中国丰满人妻videoshd| 狠狠噜天天噜日日噜| 91精产国品一二三产区别沈先生| 成人在线免费观看av| 亚洲国产精品成人天堂| 日韩精品视频网址| 午夜精品中文字幕| 日韩一级理论片| av免费在线播放网站| 人妻久久久一区二区三区| 丰满人妻一区二区三区53号| 亚洲一区二区三区四区精品| 久热在线视频观看| 中文字幕av专区| 美女网站视频黄色| japanese在线播放| 在线无限看免费粉色视频| 日日干夜夜操s8| 国产成人黄色网址| 亚洲一级片网站| www.色就是色.com| 亚洲av无日韩毛片久久| www.桃色.com| 中文字幕第50页| 欧美中日韩在线| 欧美一区二区视频在线播放| 亚洲国产一二三精品无码| 欧美少妇一级片| 蜜臀av性久久久久蜜臀av| 亚洲精品天堂成人片av在线播放| 最新中文字幕久久| 99久热在线精品视频| 97碰在线视频| 成人在线观看你懂的| 欧美网站免费观看| 男人操女人免费软件| 免费日韩中文字幕| 最新天堂在线视频| 亚洲综合伊人久久| 国产又粗又爽又黄的视频| 26uuu成人| 精品少妇人欧美激情在线观看| 日韩人妻无码精品久久久不卡| 久久av综合网| 久久精品香蕉视频| 加勒比av中文字幕| 国产91porn| 久久综合九色综合88i| 亚洲中文字幕无码不卡电影| 亚洲综合婷婷久久| www.18av.com| 免费看国产曰批40分钟| chinese少妇国语对白| 五月天婷婷亚洲| 久久福利一区二区| av免费中文字幕| 日韩视频在线观看一区二区三区| 91麻豆天美传媒在线| 老太脱裤让老头玩ⅹxxxx| 免费激情视频在线观看| 五月激情五月婷婷| 男人添女荫道口喷水视频| 日本三区在线观看| www.午夜色| 欧美视频第一区| 日韩高清在线一区二区| 日韩五码在线观看| 亚洲小视频网站| 成人午夜精品久久久久久久蜜臀| 午夜精品久久久内射近拍高清| 三区视频在线观看| 日本十八禁视频无遮挡| 玖玖爱视频在线| 国产女大学生av| 伊人成人免费视频| 国产日韩一区二区在线| 小说区视频区图片区| 精品国产一二三四区| 日韩成人精品视频在线观看| 水蜜桃色314在线观看| 亚洲精品蜜桃久久久久久| a在线观看免费视频| 久久亚洲精品无码va白人极品| 欧美一级特黄a| 青春草国产视频| 亚洲综合伊人久久| 99精品免费在线观看| 国产精品啪啪啪视频| 嫩草影院国产精品| 日韩欧美视频网站| 永久免费看av| 最新国产黄色网址| 久久久999免费视频| 色哟哟免费网站| 天堂一区在线观看| 欧美视频在线播放一区| 日韩精品在线播放视频| 天天爱天天操天天干| 日本免费色视频| 国产一区视频免费观看| 日韩亚洲欧美视频| 国产树林野战在线播放| 一起操在线视频| www.超碰com| av网站在线观看不卡| 国产高清av在线播放| 国产卡一卡二在线| 成人黄色一级大片| 国产自偷自偷免费一区| 日本wwww视频| 欧美v在线观看| 日韩a∨精品日韩在线观看| www.69av| 国产一区二区三区播放| 青娱乐精品在线| 日本高清一区二区视频| 亚洲综合日韩欧美| 色综合色综合色综合色综合| 久草青青在线观看| 欧美色图另类小说| 欧美激情 国产精品| 成人午夜视频在线观看免费| 好吊色视频988gao在线观看| 丰满女人性猛交| 五月天六月丁香| 咪咪色在线视频| 国产精品久久久久久9999| 天天操狠狠操夜夜操| 久久99爱视频| 艹b视频在线观看| 日本肉体xxxx裸体xxx免费| 人人干人人干人人| 色乱码一区二区三区在线| 日日噜噜噜噜久久久精品毛片| 免费在线观看日韩视频| 成人在线观看黄| 亚洲少妇久久久| 中文字幕 日韩 欧美| 精品亚洲视频在线| 影音先锋男人的网站| 黄色网络在线观看| 亚洲啊啊啊啊啊| 亚洲国产精品无码观看久久| www..com日韩| 日韩在线第三页| 午夜免费福利在线| 99中文字幕在线| 天堂а√在线中文在线| 成人免费a级片| 丰满爆乳一区二区三区| 黄色三级视频片| 久久综合在线观看| 中国黄色录像片| 91丨porny丨探花| 亚洲精品无码久久久久久| 欧美日韩亚洲自拍| 男女h黄动漫啪啪无遮挡软件| 成人短视频在线观看免费| 妞干网在线视频观看| 成人黄色一区二区| 色中文字幕在线观看| 国产免费一区二区视频| 99精品视频在线看| 极品粉嫩美女露脸啪啪| 亚洲乱码日产精品bd在线观看| 免费看黄在线看| 亚洲人辣妹窥探嘘嘘| 99精品一级欧美片免费播放| 国产av人人夜夜澡人人爽麻豆| 欧美视频第三页| www.偷拍.com| 午夜精品久久久久久久无码| 五月婷婷六月丁香激情| 亚洲精品天堂成人片av在线播放 | 日本男女交配视频| 成人免费毛片播放| 五月天综合婷婷| 久久国产色av免费观看| 国产免费色视频| 国产99久久九九精品无码| 久久6免费视频| 欧美色图色综合| 亚洲欧美日韩网站| 天天夜碰日日摸日日澡性色av| 自拍偷拍21p| 久久视频这里有精品| 91看片破解版| 国产淫片免费看| 四虎精品欧美一区二区免费| 中文字幕欧美人妻精品一区| 国产情侣第一页| 中文字幕在线视频精品| 美女av免费在线观看| 污免费在线观看| 日本va中文字幕| 免费看欧美黑人毛片| 伊人色在线视频| 男人日女人bb视频|