大端和小端
- 大端法:高位保存在低地址中
- 小端法:高位存放在高地址中
大端和小端法對(duì)程序的影響
字節(jié)序不是由操作系統(tǒng)決定,而是由cpu架構(gòu)決定的
比如 x86 的是小端序候址,而 PPC (PowerPC) 是big endian变姨,所以跑在 x86 上的 linux/windows 都是小端族扰,而跑在 PPC 上的linux則是大端。網(wǎng)絡(luò)字節(jié)序?yàn)榇蠖?/strong>
程序判斷大端法還是小端法
#include <stdio.h>
int main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if (sizeof(short) == 2)
{
if (un.c[0] == 1 && un.c[1] == 2)
printf("Big-Endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("Little-Endian\n");
else
printf("not known\n");
}
else
{
printf("sizeof(short) = %d\n", sizeof(short));
}
}
網(wǎng)絡(luò)編程中常用的字節(jié)序轉(zhuǎn)換函數(shù)有如下幾個(gè):
#include <<netinet/in.h>>
uing16_t htons(uint16_t host16bitvalue); // 參數(shù)為16位主機(jī)字節(jié)序的值定欧,返回值是16位網(wǎng)絡(luò)字節(jié)序的值
uint32_t htonl(uint32_t host32bitvalue); // 參數(shù)為32位主機(jī)字節(jié)序的值渔呵,返回值是32位網(wǎng)絡(luò)字節(jié)序的值
uint16_t ntohs(uint16_t net16bitvalue); // 參數(shù)為16位網(wǎng)絡(luò)字節(jié)序的值,返回值是16位主機(jī)字節(jié)序的值
uint32_t ntohl(uint32_t net32bitvalue); // 參數(shù)為16位網(wǎng)絡(luò)字節(jié)序的值砍鸠,返回值是16位主機(jī)字節(jié)序的值