FILE* fp;
test = 0x3132; //(31ASIIC 码的’1’,32ASIIC 码的’2’)
if ((fp = fopen ("c:\\test.txt", "wb")) == NULL)
assert(0);
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
}
然后在 C 盘下打开 test.txt 文件,可以看见内容是 21,而 test 等于 0x3132,可以明显的看出来 x86
的字节顺序是低位在前.如果我们把这段同样的代码放到(big-endian)的机器上执行,那么打出来的
文件就是 12.这在本机中使用是没有问题的.但当你把这个文件从一个 big- endian 机器复制到一个
little-endian 机器上时就出现问题了.
如上述例子,我们在 big-endian 的机器上创建了这个 test 文件,把其复制到 little-endian 的机器
上再用 fread 读到一个 short 里面,我们得到的就不再是 0x3132 而是 0x3231 了,这样读到的数据就
是错误的,所以在两个字节顺序不一样的机器上传输数据时需要特别小心字节顺序,理解了字节顺
序在可以帮助我们写出移植行更高的代码.
正因为有字节顺序的差别,所以在网络传输的时候定义了所有字节顺序相关的数据都使用
big-endian,BSD 的代码中定义了四个宏来处理:
#define ntohs(n) //网络字节顺序到主机字节顺序 n 代表 net, h 代表 host, s 代表 short
#define htons(n) //主机字节顺序到网络字节顺序 n 代表 net, h 代表 host, s 代表 short
#define ntohl(n) //网络字节顺序到主机字节顺序 n 代表 net, h 代表 host, s 代表 long
#define htonl(n) //主机字节顺序到网络字节顺序 n 代表 net, h 代表 host, s 代表 long
举例说明下这其中一个宏的实现:
#define sw16(x) \
((short)( \
(((short)(x) & (short)0x00ffU) << 8) | \
(((short)(x) & (short)0xff00U) >> 8) ))
这里实现的是一个交换两个字节顺序.其他几个宏类似.
我们改写一下上面的程序
#include
#include
评论