关于字节序的一些思考

整理了一下网络上关于字节序的描述和自己的理解。

小端字节序

简单的说就是:低字节存储在起始地址指向的地方。
比如:
short int 0xaabb
在小端的系统中存储方式是(假设地址从0开始):

地址01
数据0xbb0xaa
大端字节序

就是高字节存储在起始地址指向的地方。
同样一个short int 0xaabb
在大端的系统中存储方式是:

地址01
数据0xaa0xbb

那么我们在网络编程的时候,为什么以及在什么情况下需要字节序转换呢?
若不进行字节序转换时:
同样一个short int 0xaabb由PC1经网络(网络字节序是大端)传输至PC2时

PC1:大端 地址01实际值
数据0xaa0xbb0xaabb
net:大端 字节号01实际值
数据0xaa0xbb0xaabb
PC2:大端 地址01实际值
数据0xaa0xbb0xaabb

当一台PC是小端,一台PC是大端时:

PC1:小端 地址01实际值
数据0xbb0xaa0xaabb
net:大端 字节号01实际值
数据0xbb0xaa0xbbaa
PC2:大端 地址01实际值
数据0xbb0xaa0xbbaa

从这个例子就可以看出,为什么需要字节序转换了。可以理解为:虽然在内存中存储的方式是一样的,但是大端和小端系统对其进行了不同的解析,导致实际值变了。
若两个pc都是小端呢,会不会解析错误呢?
答案是不会的。
但是更加严谨的办法是,在网络编程中,只要使用了short,int,long这种超过一个字节的变量,那么就需要用hton函数来进行字节序转换,同样的接收方需要用ntoh来转换字节序。

之前一直困扰我的是,如果一个结构体:

struct c{
    char a;
    char b;
}

传输这样一个结构体c的时候需不需进行字节序转换,在理解了其在内存中存储的方式没变,以及不管是大端还是小端的机器,都是从低地址进行操作的之后,我们很容易的得出,是不需要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值