字节序
主机字节序输出本机字节序socket编程字节序转换
主机字节序
一个16位整数,由2个字节组成。内存中存储这两个字节有两种方法:
小端(little-endian)字节序:是将低序字节存储在起始地址。大端(big-endian)字节序:是将高序字节存储在起始地址。 顶部标明内存地址增长的方向为从右到左,在底部标明内存地址增长的方向为从左到右。最高有效位(most significant bit,MSB)是这个16位值最左边一位,最低有效位(lest significant bit,LSB)是这个16位值最右边一位。
两种字节序之间没有统一的标准可循,两种格式都有系统使用。
在一个短整数变量中存放2字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以此确定字节序。
(0x0102) 二进制序列(0000 0001 0000 0010) 把二进制序列按一个字节8位拆分 (0000 0001)转十进制就是(1) (0000 0010)转十进制就是(2) 我系统主机字节序(7.5.0: little-endian)大端[2, 1]
输出本机字节序
查看自己系统 主机字节序(host byte order) 完整代码如下:
#include
#include
int
main(int argc, char *argv[])
{
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
printf("%s: ", __VERSION__);
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("unknown\n");
}
}
else
{
printf("sizeof(short) = %ld\n", sizeof(short));
}
exit(0);
return 0;
}
socket编程字节序转换
因为网络字节序是大端,一般操作系统都是小端,本机要连接网络就必须要转为网络字节序,才能通信 代码示例使用端口号,主机字节序转网络字节序,在socket编程中是必须知道和掌握的
#include
#include
#include
#include
#define PORT 1234
int main(int argc, char *argv[])
{
struct in_addr in;
in.s_addr = htonl(PORT); // 主机字节转网络字节
printf("Network byte order: %08x\n", in.s_addr); //网络字节序
printf("Host byte order: %08x\n", ntohl(in.s_addr)); // 主机字节序
return 0;
}
端口用十六进制输出的结果 Network byte order: d2040000 Host byte order: 000004d2
精彩链接
发表评论