js 讀取服務端發來的protobuf位元組流中的float出錯,須把位元組流反過來讀才可以
阿新 • • 發佈:2018-11-11
查看了protobuf的原始碼,看到了writeFloat方法中的writeTagAndRawLittleEndian32,然後順便了解了下LittleEndian,
參考了 https://www.cnblogs.com/passingcloudss/archive/2011/05/03/2035273.html
https://www.cnblogs.com/passingcloudss/archive/2011/05/03/2035273.html 小端格式和大端格式(Little-Endian&Big-Endian) 不同的CPU有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序。 最常見的有兩種: 1. Little-endian:將低序位元組儲存在起始地址(低位編址) 2. Big-endian:將高序位元組儲存在起始地址(高位編址) LE(little-endian): 最符合人的思維的位元組序 地址低位儲存值的低位 地址高位儲存值的高位 怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 低位值小,就應該放在記憶體地址小的地方,也即記憶體地址低位 反之,高位值就應該放在記憶體地址大的地方,也即記憶體地址高位 BE(big-endian): 最直觀的位元組序 地址低位儲存值的高位 地址高位儲存值的低位 為什麼說直觀,不要考慮對應關係 只需要把記憶體地址從左到右按照由低到高的順序寫出 把值按照通常的高位到低位的順序寫出 兩者對照,一個位元組一個位元組的填充進去 例子1:在記憶體中雙字0x01020304(DWORD)的儲存方式。 記憶體地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04 注:每個地址存1個位元組,每個字有4個位元組。2位16進位制數是1個位元組(0xFF=11111111)。 例子2:如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x23 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12 x86系列的CPU都是little-endian的位元組序
原來是小端和大段的原因,剛好js也需要把位元組流反過來讀才行,所以把讀取順序按照小端來讀就OK了