最近在做rtmp流**網路傳送的時候遇到了大小端的問題,也就是各位檢視原始碼時經常看到的htonl, htons等。hton函式就是用作大小端轉換的,說明如下:
htonl將主機數轉換成無符號長整型的網路
位元組順序
。本函式將乙個32位數從主機位元組順序轉換成網路位元組順序。
首先看乙個簡單的語句: int len = 3;
類似語句估計大家都寫過無數遍了,假設乙個int佔據4個位元組,那麼將3十六進製製化後為:0x00 0x00 0x00 0x03,再假設在記憶體中len的首位址為0x01。由於大家使用的電腦晶元一般為intel的x86系列晶元,而x86晶元採用小端模式,所以編譯執行後記憶體中的儲存如下:
0x10---0x00
0x11---0x00
0x12---0x00
0x13---0x03
即高位址放低位。但是在網路傳送中需要的大端序,即要求是按照:
0x10---0x03
0x11---0x00
0x12---0x00
0x13---0x00
這樣的順序儲存才能正確傳送出去int型的3。所以必須使用int len = htonl(3)來這樣進行儲存轉換才能正確傳送。也正因此,當變數長度為乙個byte的時候,就沒要使用hton函式來轉換儲存了,因為只占用乙個位址。。。也因此,對於某些長度比較特殊的變數,大家會看到如下的語句:
number64 swap_number64(number64 n)
目的同樣是用作網路傳送前的大小端轉換。
所以,總結就是大小端是為了網路傳送前的記憶體轉換而用的(一般主機的小端->網路的大端),乙個位元組沒必要轉換,直接複製或者memcpy就好了。
大小端 網路位元組序問題
總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...
大小端問題網路位元組序
關於位元組序 大端法 小端法 的定義 unxi網路程式設計 定義 術語 小端 和 大端 表示多位元組值的哪一端 小端或大端 儲存在該值的起始位址。小端存在起始位址,即是小端位元組序 大端存在起始位址,即是大端位元組序。也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位...
網路位元組序以及大小端
記憶體中的多位元組資料相對於記憶體位址有大端和小段之分,磁碟檔案中的多位元組資料相對於檔案中的偏移位址也有大端和小端之分,網路資料流同樣有大端小端之分,那麼如何定義網路資料流的位址呢?傳送主機通常將傳送快取區中的資料按記憶體位址從低到高的順序發出,接收主機把從網路上接到的位元組依次儲存在接受緩衝區中...