字节序

主机字节序输出本机字节序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

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。