1、詳細講解一下何為網路位元組序以及何為主機位元組序
1. Little endian:將低序位元組存儲在起始地址
2. Big endian:將高序位元組存儲在起始地址
LE little-endian
最符合人的思維的位元組序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
2、C# uint無符號整數轉主機位元組序
uint可以強制轉換成int,轉成主機位元組序之後再強制轉換回uint。這兩個類型的轉換只在語義層面上有影響,對內存中數據的實際表示沒有影響。
3、是不是大多數電腦的主機位元組序都是小端的
普通人用的桌面電腦,只要是Intel或AMD的x86/x64架構就一定是小端位元組序。
外很多ARM CPU可以選擇數據指令位元組序,不過通常也都是運行小端位元組序(比如我們的智能手機)。
網路設備,像PowerPC核心的一些路由器,默認運行大端位元組序。
4、linux埠號主機位元組序怎麼查看
打開任務管理器(在桌面最下面的「任務欄」右擊滑鼠)。 在任務管理器界面中,選擇「詳細信息」。這時「PID」對應的一列即為自己電腦已開放的埠號,除此之外,我們還可以看到這個開放的埠所對應的程序。
5、C語言雙位元組的數怎麼由主機位元組序轉化網路位元組序
unsigned short a = 0x1122;
unsigned short b = (a>>8) || (a<<8);
其中b就是網路位元組序(大端)
6、htons和htonl都是把主機位元組序轉換成網路位元組序。那什麼時候用htons,什麼時候用htonl??
根據要轉換的值是否超過16位來決定,5555轉換為2進制為1 0101 1011 0011 ,為13位,所以一般用htons,當然用htonl也可以;
但是如果要轉換的數 轉換成2進制超過16位,則只能用htonl,此時如果用htons,16位以上的數捨去,造成數據值偏差。
7、C++問題,VS2010C++有沒有提供按照little endian(小位元組序)讀指定位元組數據的方法,謝謝
htons表示short類型的數據由主機位元組序轉為網路位元組序。而ntohs表示是網路位元組序轉換到主機位元組序。
因為歷史的原因網路位元組序約定為大端(bigedian),而主機位元組序位則依據CPU的類型各有不同,我們普通的intel處理器為小端,而powerpc等一些處理器則是大端。那麼從主機出去的數據到網路上例如是INTEL,那是要轉換的。所以你這個無論是伺服器還是客戶端,只要是出去的數據都是要經過htonxx這樣的函數轉換。如果是接收呢,則是要通過ntohxx這樣的函數轉換的。
設置埠由於是面向網路操作,所以也是要使用htons轉換的。
8、c++和python如何實現主機位元組序和網路位元組序
你要自己實現嗎,就是檢測主機位元組序,然後轉成big endian就行了。
網路編程中netinet/in.h這個頭文件裡面有兩個函數htons和htonl就是做這個的。
9、vb 中有沒有現成的主機位元組序轉網路位元組序的函數
有的
10、網路位元組序與主機位元組序
不同的CPU有不同的位元組序類型 這些位元組序是指整數在內存中保存的順序 這個叫做主機序
最常見的有兩種
1. Little endian:將低序位元組存儲在起始地址
2. Big endian:將高序位元組存儲在起始地址
LE little-endian
最符合人的思維的位元組序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE big-endian
最直觀的位元組序
地址低位存儲值的高位
地址高位存儲值的低位
為什麼說直觀,不要考慮對應關系
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個位元組一個位元組的填充進去
例子:在內存中雙字0x01020304(DWORD)的存儲方式
內存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果為
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的位元組序.
大端小端轉換方法:
Big-Endian轉換成Little-Endian如下:
#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) |
(((uint16)(A) & 0x00ff) << 8))
#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) |
(((uint32)(A) & 0x00ff0000) >> 8) |
(((uint32)(A) & 0x0000ff00) << 8) |
(((uint32)(A) & 0x000000ff) << 24))
大端小端檢測方法:
如何檢查處理器是big-endian還是little-endian?
聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕松地獲得了CPU對內存採用Little-endian還是Big-endian模式讀寫。
int checkCPUendian()
{
union
{
unsigned int a;
unsigned char b;
}c;
c.a = 1;
return (c.b == 1);
}
網路位元組順序
網路位元組順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
為了進行轉換 bsd socket提供了轉換的函數 有下面四個
htons 把unsigned short類型從主機序轉換到網路序
htonl 把unsigned long類型從主機序轉換到網路序
ntohs 把unsigned short類型從網路序轉換到主機序
ntohl 把unsigned long類型從網路序轉換到主機序
在使用little endian的系統中 這些函數會把位元組序進行轉換
在使用big endian類型的系統中 這些函數會定義成空宏
同樣 在網路程序開發時 或是跨平台開發時 也應該注意保證只用一種位元組序 不然兩方的解釋不一樣就會產生bug.