大端序(big endian):高序字節存儲在低地址(指CPU對操作數的存放方式是將數據的高位存放在內存中的低地址,而數據的低位存放在內存中的高地址。)
- 將高字節存儲在起始地址,成爲“Big Endian”字節序,由Motorola等所採用
- ARM大小端可選
小端序(little endian):低序字節存儲在低地址(指CPU對操作數的存放方式是將數據的低位存放在內存中的高地址,而數據的低位存放在內存中的搞地址。)
- 將低字節存儲在起始地址,成爲“Little Endian”字節序,Intel、AMD等採用的是這種方式。
大多數ARM處理器都是採用的小端模式,網絡中傳輸的數據必須按網絡字節序,即大端序。
在大部分PC機上,當應用進程將整數送入socket前,需要轉化成網絡字節序;當應用進程從socket取出整數後,要轉化成小端字節序。
字節序轉換函數
把給定系統所採用的的字節序稱爲主機字節序。爲了避免不同類別主機之間在數據交換時由於對於字節序的不同而導致的差錯,引入了網絡字節序。
主機字節序(Host Byte Order)到網絡字節序(Network Byte Order):
- uint32_t htonl(uint32_t hostlong);
- uint16_t htons(uint16_t hostshort);
網絡字節序到主機字節序:
- uint32_t ntohl(uint32_t netlong);
- uint16_t ntohs(uint16_t netshort);
判斷程序
#include <stdio.h>
int check_system()
{
int n = 0x87654321;
if(*(char *)&n == 0x21)
{
return 1;
}
else
{
return 0;
}
return 0;
}
int check_system2()
{
union check
{
int a;
char b;
}m;
m.a = 0x87654321;
if(m.b == 0x21)
{
return 1;
}
else
{
return 0;
}
return 0;
}
int main()
{
if(check_system() == 1)
// if(check_system2() == 1)
{
printf("小端序\n");
}
else
{
printf("大端序\n");
}
}