大小端以及位元組序的問題

2021-09-08 11:21:01 字數 3409 閱讀 4925

網路位元組順序nbo(network byte order):按從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。

the order in which the bytes of a multi-byte number are transmitted on a network - most significant byte first (as in "big-endian" storage). 

主機位元組順序(hbo,host byte order):不同的機器hbo不相同,與cpu設計有關計算機資料儲存有兩種位元組優先順序:高位位元組優先和低位位元組優先。

c#中可以通過bitconverter.islittleendian

console.writeline("

bitconverter.islittleendian =

", bitconverter.islittleendian);

需要注意的是無符號的整型

uint a=3758205120;  

從下圖可以看出最高位的位元組是 1110 0000 是沒有符號位的

ipaddress中處理的都是有符號的

int d=2147483647;  //2^31-1

//d=2147483648;  //int的取值不能超出2147483647,這個賦值溢位了

但是uint就可以賦值:  uint d = 2147483648;

===2023年09月23日更新===

位元組陣列的高低位問題

console.writeline("

bitconverter.islittleendian =

", bitconverter.islittleendian);

const

int number = 0x01020304

; console.writeline(

"0x01020304 =

", number);

var array =bitconverter.getbytes(number);

int index = -1

;

foreach (byte b in

array)

] = 0x

", index, b.tostring("x2"

)); }

輸出結果是:

bitconverter.islittleendian = true

0x01020304 = 16909060

array[0] = 0x04

array[1] = 0x03

array[2] = 0x02

array[3] = 0x01

0x01020304對應4位元組的數字16909060,二進位制為  0000 0001,0000 0010,0000 0011,0000 0100

4個位元組從高到低: 最高位是0000 0001   最低位是0000 0100

bitconverter.getbytes(number);
經過bitconverter.getbytes獲取的位元組陣列,下標小的對應於最低位

console.writeline("

bitconverter.islittleendian =

", bitconverter.islittleendian);

var result = int.maxvalue.tostring("x"

); console.writeline(result);

//result: 7fffffff

result = bitconverter.tostring(bitconverter.getbytes(int

.maxvalue));

console.writeline(result);

//result: ff-ff-ff-7f

輸出結果:

bitconverter.islittleendian = true

7fffffff

ff-ff-ff-7f

解答:int.maxvalue.tostring("x")outputs7fffffff, that is, the number2147483647as a whole.

on the other hand,bitconverter.getbytesreturns an array of bytes representing2147483647in memory. on your machine, this number is stored in little-endian (highest byte last). andbitconverter.tostringoperates separately on each byte, therefore not reordering output to give the same as above, thus preserving the memory order.

however the two values are the same :7f-ff-ff-ffforint.maxvalue, in big-endian, andff-ff-ff-7fforbitconverter, in little-endian. same number.

位元組序的高低位

高位和低位,參看計算器-->程式設計師,左高右低

比如0x0102 兩個位元組 01是高位,02是低位

小端位元組序:高位在高位址,低位在低位址

大端位元組序:高位在低位址,低位在高位址

192.168.1.224

小端位元組序:0xc0a801e0 對應數字3232236000

大端位元組序:0xe001a8c0   假如按照小端來解析數字的話是3758205120,按照大端來解析首先反轉,然後再解析會是3232236000

大小端以及位元組序的問題

網路位元組順序nbo network byte order 按從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。the order in which the bytes of a multi byte number are transmitted on a network m...

大小端以及主位元組序和網路位元組序問題

大小端問題與主位元組序及網路位元組序 一般在x86和arm下為小端模式 1 2 例如 0x0000 0x12 0x0001 0x34 0x0002 0xab 0x0003 0xcd 大端模式讀取為 1234abcd 小端模式讀取資料為 cdab3412.而網路位元組序這是tcp ip協議中定義好的一...

大小端,位元組序問題

總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...