1. 程式人生 > >js 讀取服務端發來的protobuf位元組流中的float出錯,須把位元組流反過來讀才可以

js 讀取服務端發來的protobuf位元組流中的float出錯,須把位元組流反過來讀才可以

查看了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了