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国产成人精品免费视频_国产嫩草影院

            久久久久免费精品| 亚洲精品无码久久久久久| 日本三级中文字幕在线观看| 亚洲视频在线观看一区二区三区| 天天做天天躁天天躁| 小早川怜子一区二区三区| 成年人在线看片| 91免费黄视频| 男女激情免费视频| 在线观看av的网址| 最新视频 - x88av| 尤物网站在线看| 天堂中文av在线| 午夜宅男在线视频| 免费一级特黄录像| 在线观看av日韩| 亚洲五月天综合| 日本老熟妇毛茸茸| 日韩毛片在线免费看| 日韩av片在线看| 穿情趣内衣被c到高潮视频| 黄色永久免费网站| 在线观看国产福利| 不卡中文字幕在线观看| 日韩在线不卡一区| 久久精品视频在线观看免费| 国产一区二区在线观看免费视频| 91看片破解版| 天堂在线精品视频| 天堂av在线中文| 17c丨国产丨精品视频| 成人精品视频在线播放| 国产精品裸体瑜伽视频| 5月婷婷6月丁香| 久久精品网站视频| 在线观看免费污视频| www.cao超碰| 欧美精品一区二区性色a+v| www.18av.com| 91视频 -- 69xx| 婷婷丁香激情网| 欧美精品 - 色网| 一本色道久久88亚洲精品综合| 日本一本中文字幕| 国产综合免费视频| 中文字幕日韩综合| www.激情网| 国产午夜伦鲁鲁| 亚洲xxxx2d动漫1| 一区二区三区日韩视频| 日韩成人三级视频| 日韩在线xxx| 中国黄色片一级| 国产欧美久久久久| 日本va中文字幕| 男女h黄动漫啪啪无遮挡软件| 四季av一区二区三区| 在线免费黄色小视频| www.欧美黄色| 国产成人手机视频| 国产精品jizz在线观看老狼| 人妻夜夜添夜夜无码av| 国产又猛又黄的视频| 日韩中文字幕亚洲精品欧美| 亚洲中文字幕无码中文字| 中文字幕第17页| youjizz.com在线观看| 免费看a级黄色片| 色乱码一区二区三区熟女| 日本少妇高潮喷水视频| 亚洲天堂网2018| 极品粉嫩国产18尤物| 孩娇小videos精品| 国产天堂视频在线观看| 国产精品视频黄色| 久久久久久久9| 手机视频在线观看| 精品少妇在线视频| 国产精品久久久久久久99| 成人av一级片| gogogo免费高清日本写真| 国模杨依粉嫩蝴蝶150p| 成年人视频大全| av网站在线不卡| 很污的网站在线观看| 中文字幕亚洲影院| 欧美日韩在线不卡视频| 中国女人做爰视频| 182午夜在线观看| 亚洲国产精品久久久久婷蜜芽| 日韩国产精品毛片| 久久国产激情视频| 麻豆av免费在线| 人人妻人人澡人人爽欧美一区| 欧美wwwwwww| 能在线观看的av| 黄色大片中文字幕| 亚洲区成人777777精品| 黄色手机在线视频| www.四虎成人| 99视频在线免费播放| 成年在线观看视频| 亚欧美一区二区三区| 亚洲欧美自拍另类日韩| 丁香啪啪综合成人亚洲| 国内精品在线观看视频| 久久精品在线免费视频| 在线播放av中文字幕| 九九九在线观看视频| 国产二区视频在线播放| 日本阿v视频在线观看| gogogo免费高清日本写真| 国产精品一区二区小说| 国产裸体免费无遮挡| 国产极品粉嫩福利姬萌白酱| 人妻av无码专区| 天堂а√在线中文在线| 欧美日韩亚洲国产成人| 永久免费黄色片| 日本高清久久久| 自拍偷拍一区二区三区四区| 亚洲欧美激情网| 国产麻花豆剧传媒精品mv在线| 日本网站免费在线观看| 少妇高潮喷水在线观看| 精品少妇在线视频| 欧美一级欧美一级| 欧美成人三级在线视频| a级黄色小视频| 日本黄色片一级片| 无码粉嫩虎白一线天在线观看| 免费网站永久免费观看| 精品国产一区二区三区无码| 99热久久这里只有精品| 久久久性生活视频| 国产91美女视频| 黄色a级片免费| 黑森林精品导航| 污污的视频免费观看| 日韩视频在线观看视频| 久久视频免费在线| 男人添女人荫蒂免费视频| www..com日韩| 女人另类性混交zo| 小明看看成人免费视频| 97人人模人人爽人人澡| 9191国产视频| 久久久久久久中文| 女人另类性混交zo| 一道本在线免费视频| 午夜免费一级片| 好色先生视频污| 成年女人18级毛片毛片免费| 青青草视频在线免费播放| 精品视频无码一区二区三区| 欧美在线aaa| 久久久天堂国产精品| 日本午夜激情视频| 手机看片福利日韩| 一级一片免费播放| 国产真人做爰毛片视频直播| 丰满爆乳一区二区三区| 久久久久国产一区| 日本一级淫片演员| 亚洲 欧美 日韩 国产综合 在线| 成年人在线看片| a级黄色片网站| 国产午夜伦鲁鲁| 天堂在线一区二区三区| 精品国产av无码一区二区三区| 国产精品69页| 9999在线观看| 日韩av三级在线| 一级淫片在线观看| 极品美女扒开粉嫩小泬| 黄色小视频免费网站| 女人被男人躁得好爽免费视频| 日本精品久久久久中文字幕| 一区二区三区一级片| 日本久久久精品视频| 青青草原播放器| 免费在线观看亚洲视频| 亚洲18在线看污www麻豆| 六月婷婷激情综合| 亚洲欧美久久久久| 国产精品久久久久9999爆乳| 午夜两性免费视频| 国产高清www| 日本精品一区在线| www国产精品内射老熟女| 久久精品久久99| 久久婷婷国产精品| 日韩一级特黄毛片| 日韩精品你懂的| 国产男女免费视频| 欧美xxxxxbbbbb| 日日摸天天爽天天爽视频| 国产女教师bbwbbwbbw| 亚洲va在线va天堂va偷拍| av之家在线观看|