|
字節(jié)存放有大尾和小尾之分。如果對(duì)應(yīng)數(shù)據(jù)的高字節(jié)存放在低地址就是大尾,反之,高字節(jié)存放在高地址的就是小尾。
比如 short int a = 0x1234
大尾存放時(shí):
偏移地址 存放內(nèi)容
0x0000 0x12
0x0001 0x34
小尾存放:
偏移地址 存放內(nèi)容
0x0000 0x34
0x0001 0x12
同樣的如果數(shù)據(jù)是32位、64位也就是可以類推。
判斷一個(gè)機(jī)器是大尾還是小尾我們可以通過程序進(jìn)行測(cè)試:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
short int a = 0x1234;
char *p = (char *)&a;
printf("p=%#hhx\n", *p);
if (*p == 0x34) {
printf("little endian\n");
} else if (*p == 0x12) {
printf("big endia\n");
} else {
printf("unknown endia\n");
}
return 0;
}
| 在網(wǎng)絡(luò)上傳輸數(shù)據(jù)我們采用的都是大尾。這就存在字節(jié)順序的相互轉(zhuǎn)換。
下面定義一個(gè)宏可以對(duì)16位數(shù)據(jù)進(jìn)行字節(jié)轉(zhuǎn)換
#define sw16(x) \
((short)( \
(((short)(x) & (short)0x00ffU) << 8 ) | \
(((short)(x) & (short)0xff00U) >> 8 ) ))
| 假設(shè)這里x=0xaabb
(short)(x) & (short)0x00ffU 這里的與操作將16位數(shù)據(jù)x的高8位置為0得到0x00bb,然后在左移8位就得到了0xbb00
同理(short)(x) & (short)0xff00U >> 8 就得到了 0x00aa
最后將0xbb00 和 0x00aa 進(jìn)行或運(yùn)算就實(shí)現(xiàn)了高字節(jié)和低字節(jié)的相會(huì)交換。
關(guān)于字節(jié)順序的交換我們可以參考include/linux/byteorder/ 下的文件swab.h和swabb.h中的定義
|
|