字节序

本节主要讲字节序(Byte Ordering)或者说数据存储优先顺序。
大端(big-endian),小端(little-endian)

大端字节序与小端字节序
(有的地方叫大端存储与小端存储)
下面以整数1为例来说明

16位整型数1的小端字节序
第2个字节   第1个字节
0000 0000  0000 0001
    MSB             LSB
十六进制表示:0x0001
MSB:Most Significant Byte 最高有效字节
LSB:Least Significant Byte 最低有效字节

16位整型数1的大端字节序
第2个字节   第1个字节
0000 0001  0000 0000
    MSB             LSB
十六进制表示:0x0100
十进制表示:256

32位整型数1的小端字节序
第4个字节  第3个字节   第2个字节   第1个字节
0000 0000 0000 0000  0000 0000  0000 0001
    MSB                                                  LSB
十六进制表示:0x00000001

32位整型数1的大端字节序
第1个字节  第2个字节   第3个字节   第4个字节
0000 0001 0000 0000  0000 0000  0000 0000
    MSB                                                  LSB
十六进制表示:0x01000000
十进制表示:16777216

主机字节序与网络字节序
主机字节序,对于不同的处理器,可以采用不同的大小端字节序,我这里的主机字节序是采用小端字节序存储的。
网络字节序,TCP/IP协议栈规定用大端字节序。

对于TCP/IP应用程序,有下面四个用来在处理字节序和网络字节序之间实施转换的函数。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); 返回值:以网络字节序表示的32位整数
uint16_t htons(uint16_t hostshort); 
uint32_t ntohl(uint32_t netlong); 返回值:以主机字节序表示的32位整数
uint16_t ntohs(uint16_t netshort); 
h --- host --- 主机字节序;
n --- net   --- 网络字节序;
l --- long --- 长(4字节)整数
s --- short --- 短(2字节)整数

代码示例

#include <stdio.h>
#include <arpa/inet.h>

void main()
{
        uint32_t net_long = htonl(1);
        printf("net_long = %X\n", net_long);
        uint16_t net_short = htons(1);
        printf("net_short = %X\n", net_short);

        uint32_t host_long = ntohl(net_long);
        printf("host_long = %X\n", host_long);
        uint16_t host_short = ntohs(net_short);
        printf("host_short = %X\n", host_short);
}
执行结果如下:
net_long = 1000000
net_short = 100
host_long = 1
host_short = 1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值