Little Endian VS Big Endian
Endianness, 當一個資料要儲存到記憶體時
2-2 使用 htonl 來幫忙
剛剛有提到 htonl 會將資料轉成 Big Endian,若轉換前後一致那就是 Big endian 啦
有兩種儲存方式,
如上圖其一為 Little Endian, 另一為 Big Endian
通常而言不需要考慮此排列方式的問題,
但是當要將資料傳遞到別的硬體平台上,或是網路上時
這問題就變得需要在意了,
在網路傳輸上使用的是 Big Endian,
Kernel 中也有提供 htonl, htons, ntohs, ntohl 等 function
幫助將資料在 Big Endian 及 機器的 Endian 之間作轉換 ~
目前也有平台是支援多種 Endianness 的
ex: ARM, PowerPC, MIPS …
透過硬體上的一個 Register 來設定要使用那種方式
當拿到一個新的硬體時,要如何得知此硬體目前使用的是哪一種 Endianness 呢?
1. 翻閱 Spec, 一般而言 CPU Spec 上都會標明是哪一種,不過在可以並存的硬體上
就需要別的方式來幫助判斷了。
2. 寫小程式來判別,在此提供兩種程式寫法
2-1 先宣告 integer 0x12345678
再使用一個 char pointer 檢查第一個 byte 存 0x12 or 0x78
#include
int main() {
int a = 0x12345678;
char *ptr = (char *)&a;
if (*ptr == 0x12)
printf("Big Endian\n");
else
printf("Little Endian\n");
return 0;
}
2-2 使用 htonl 來幫忙
剛剛有提到 htonl 會將資料轉成 Big Endian,若轉換前後一致那就是 Big endian 啦
#include
int main() {
int a = 0x12345678;
int b = htonl(a);
if (b == a)
printf("Big Endian\n");
else
printf("Little Endian\n");
return 0;
}
留言
張貼留言