Endianness, 當一個資料要儲存到記憶體時

有兩種儲存方式,
如上圖其一為 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 <stdio.h>

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 <arpa/inet.h>

int main() {
	int a = 0x12345678;
	int b = htonl(a);
	if (b == a)
		printf("Big Endian\n");
	else
		printf("Little Endian\n");
	return 0;
}

— Reference —
Endianness (Wikipedia)

廣告