linux大端,小端,网络字节序转换之可移植性代码

本文介绍了大端、小端和网络字节序的概念,强调网络字节序在不同主机间传输数据时的重要性。提供了一段可移植的代码,用于判断和转换字节序,确保数据在网络中的正确解释。通过实例说明如何在大端和小端系统中处理数据,以确保一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有时候经常被大端,小端,网络字节序搞得很迷糊,本文理清一些概念,并给出可移植的代码。

我们的主机字节序,即我们的机器存放内存里的顺序,有两种,一种是大端,另一种是小端,大部分的系统都是小端。

在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节,比如一个unsigned short的变量的值为十六进制"0x0a 0x0b"对应的十进制2571,这个变量跨了1个字节,占了两个字节,内存的地址都是从低位到高位的,那么0x0b是字数据的低字节,应该存储在低地址,0x0a应该存储在高地址,所以这个变量对应的内存字节buff应该是"0x0b 0x0a"。大端正好相反,低地址中存放的是字数据的高字节。

既然不同的机器可能字节序不同,那么网络中发送的数据会不会乱序呢?这里就引出了网络字节序,网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian大端排序方式。

我们可以想到,如果一个unsinged short的变量值代表一个东东的长度,是十六进制"0x0a 0x0b"对应的十进制2571,那么它传送到网络上采用大端模式,对应的字节buff也是"0x0a 0x0b",和我们的主观顺序一致。而接收端如果是大端,则直接将该buff将转为unsigned short型就可以了,如果是小端,强转后肯定乱了序。下面贴上可移植代码。

#include <byteswap.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值