位元組序,是指位元組在記憶體中的存儲順序。其又分為大端位元組(Big-Endian)序和小端位元組序(Little-Endian)。 以下摘自百度百科: a) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。 b) Big-Endian就是高位位元組排放在記憶體的低地址端 ...
位元組序,是指位元組在記憶體中的存儲順序。其又分為大端位元組(Big-Endian)序和小端位元組序(Little-Endian)。
以下摘自百度百科:
a) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。
b) Big-Endian就是高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。
什麼意思呢?
我們有一個int32的值:16909060,它的二進位表示方式是:0000 0001,0000 0010,0000 0011,0000 0100 (為了方便觀看,我加了','號)
那麼,在記憶體中我們需要4個位元組來保存這個整型數值。假設需要的記憶體地址為:0x00000001,0x00000002,0x00000003,0x00000004
對於小端位元組序,它的存放順序為:
0x00000001 | 0x00000002 | 0x00000003 | 0x00000004 |
0000 0100 | 0000 0011 | 0000 0010 | 0000 0001 |
對於大端位元組序,它的存放順序為:
0x00000001 | 0x00000002 | 0x00000003 | 0x00000004 |
0000 0001 | 0000 0010 | 0000 0011 | 0000 1000 |
那麼,在.net中是採用哪種位元組序呢?
先下結論:.net在記憶體中採用的是Little-Endian。
測試原理:利用 Buffer.BlockCopy 方法將一個int32位的值複製到int16值中。 Buffer.BlockCopy 方法將指定的count個數組從src複製到dst,並能指定開始複製的偏移位置。BlockCopy 方法使用記憶體的偏移量訪問 src 參數數組中的位元組,而不是使用索引或數組上下限等編程構造。註意,是記憶體的偏移量,即該方法是從記憶體中一個一個位元組的複製值,而不是直接複製數值結構
以下是源代碼:
1 var sours = new int[] { 175 }; 2 var dest = new short[1]; 3 var sp = 0; //源序列偏移地址 4 var dp = 0; //目標位置偏移地址 5 var count = 2; //一次拷貝位元組數 6 7 Buffer.BlockCopy(sours, sp, dest, dp, count); 8 foreach (var i in dest) 9 { 10 Console.WriteLine(i); 11 }
結果輸出:175.
代碼里一次複製2個位元組,整好是一個int16所需要的位元組大小。而源數組的起始偏移量是0.如果我們把sp的值改成2,即偏移2個位元組,最後的輸出就變成了0.這是因為175的高位位元組是0000 0000,0000 0000,他存放在記憶體的高地址中。