2014年5月1日 星期四

byte order

在電腦,short (16-bit)、long (32-bit)、long long (64-bit) 分別需要 2、4、8 byte 的連續記憶體存放,這時候就有記憶體低位址放高位元組 (big endian),還是放低位元組 (little endian) 的問題,這就是位元組順序 (byte order)。big endian 跟 little endian 名稱由來是一個關於雞蛋哪頭先敲的故事

0x87654321 放記憶體的情形

big endian
little endian
資料0x870x650x430x21
0x210x430x650x87
位址0123
0123

x86 處理器就是典型使用 little endian 的處理器,而網路封包欄位通常是高位元組先送收,在記憶體會高位元組先放,所以是 big endian。如果資料的 endian 跟處理器不同,要運算時需要作 endian 轉換。

主機 (host,也就處理器架構) 的 byte order 跟不同 endian 的轉換函數:
  • uint16_t htobe16(uint16_t)
  • uint16_t htole16(uint16_t)
  • uint16_t be16toh(uint16_t)
  • uint16_t le16toh(uint16_t)
其中 h 代表 host byte order,16 亦可為 32 或 64

網路封包的欄位可以用上述 big endian 轉換的函數,但通常用 ntohs()、htons()、ntohl()、htonl() 函數。

問題:需要 preprocessor macro 嗎?有標準的 macro?

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...