時隔乙個月又回到了寫文章,很開心o(∩_∩)o~~
今天在做需求的涉及到乙個韌體版本的概念,其中韌體組的人談到了版本號從msb
到lsb
排列,檢索查閱後將所得整理如下。
msb(most significant bit):最高有效位,二進位制中代表最高值的位元位,這一位對數值的影響最大。
lsb(least significant bit):最低有效位,二進位制中代表最低值的位元位
例如,在二進位制的1001(十進位制的9)中,最左邊的「1」即是msb對數值影響最大,從1到9的變化幅度。而最右邊的1是lsb因為僅會讓數值產生8到9的變化。
總結:msb指二進位制中表示的最高有效位,lsb指資料的最低有效位,1(msb)001(lsb)
把資料放到記憶體中先放到低位位址編號在用高位位址編號。
如 0x0000-->0x0001-->0x0002-->0x0003
示例:假如現在有乙個32位int型數0x12345678。
上面講到儲存器已位元組(8bit)為基本單位,那麼32位的數在記憶體中就對應32/8=4,需要4個記憶體位址表示的記憶體空間去儲存這個資料。
這個數的msb為0x12,
這個數的lsb 為0x78
op0表示乙個32位資料的最高位元組msb(most significant byte),使用op3表示乙個32位資料最低位元組lsb(least significant byte)。
位址偏移
大端模式
小端模式
0x00
12(op0)
78(op3)
0x01
34(op1)
56(op2)
0x02
56(op2)
34(op1)
0x03
78(op3)
12(op0)
資料按照大端模式及小端模式在記憶體中儲存的示意圖如下
區別:採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低位址,小端方式將高位存放在高位址。
採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。
有的處理器系統採用了小端方式進行資料存放,如intel晶元是小端(修改分割槽表時要注意)。
有的處理器系統採用了大端方式進行資料存放,如ibm半導體和freescale的powerpc處理器以及一些常見的微控制器晶元。不僅對於處理器,一些外設的設計中也存在著使用大端或者小端進行資料存放的選擇。
特別的intel x86的cpu使用的是le(windows中稱為「主機位元組序」),而socksaddr中使用的則是be(就是「網路位元組序」),所以在使用網路程式設計時需要使用htns,htnl,nths,nthl來倒位元組序。
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。
網路位元組順序採用big endian(大端)排序方式。
tcp/ip協議規定:把接收到的第乙個位元組當作高位位元組看待,這就要求傳送端傳送的第乙個位元組是高位位元組;
而在傳送端傳送資料時,傳送的第乙個位元組是該數值在記憶體中的起始位址處對應的那個位元組,也就是說,該數值在記憶體中的起始位址處對應的那個位元組就是要傳送的第乙個高位位元組,即多位元組數值在傳送之前,在記憶體中因該是以大端法存放的。
網路位元組序是確定的,明確以大端方式進行排序。但是,主機位元組序有可能是按照大端存放(大端大端,無需轉換),也有可能按照小端存放(大端小端,用特定函式進行轉換)
清晰講解LSB MSB和大小端模式及網路位元組序
時隔乙個月又回到了寫文章,很開心o o 今天在做需求的涉及到乙個韌體版本的概念,其中韌體組的人談到了版本號從msb到lsb排列,檢索查閱後將所得整理如下。msb most significant bit 最高有效位,二進位制中代表最高值的位元位,這一位對數值的影響最大。lsb least signi...
大小端的問題 什麼是大小端和如何實現大小端)
1.什麼是大小端?1 大端 big endian 資料的高位元組存放在記憶體的低位址中,而資料的低位元組存放在記憶體的高位元組中。高低大 2 小端 little endian 資料的高位元組存放在記憶體的高位址中,而資料的低位元組存放在記憶體的低位元組中。高高小 下面以unsigned int va...
位元組序和大小端
大多數處理器中記憶體是可以以位元組為單位進行定址的,當資料型別 int,long 大於1個位元組時,其所占用就的位元組在記憶體中的順序存在兩種模式,分別是小端模式 little endian 和大端模式 big endian 小端模式低位位元組存放在低位址,大端模式高位位元組存放在低位址。大端模式的...