C/C++ —— 小端转大端函数的使用

本文详细介绍了在不同操作系统环境下(Windows与Linux)进行字节序转换的函数,包括htonl、ntohl、htons、ntohs等,并提供了具体的使用示例。同时,文章还解释了大端与小端模式的概念,帮助读者更好地理解字节序转换的重要性。

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

函数说明

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
/*
h表示host,n表示network,l表示32位长整数,s表示16位短整数。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
*/

windows下

如果是VS,包含头文件及ws2_32.lib库

#include <winsock.h> 
#pragma comment(lib, "ws2_32.lib")

如果是QtCreator,包含头文件及ws2_32.lib

.pro中:

LIBS += -LC:\Users\HHT\Desktop\serialPort\ -lWS2_32

其中,C:\Users\HHT\Desktop\serialPort\ 是ws2_32.lib所在路径。

cpp文件:

#include <winsock.h>

测试代码:

	unsigned short test1 = htons(0xffee);
	cout << 0xffee << endl;
	cout << test1 << endl;//转换后为0xeeff
	unsigned int test2 = htonl(0xaaeeeeee);
	cout << 0xaaeeeeee << endl;
	cout << test2 << endl;//转换后为0xeeeeeeaa


Linux(Ubuntu)下

在QtCreator中测试

头文件

#include <arpa/inet.h>

测试代码:

    qDebug()<<"htons:"<<htons(0xffee);
    qDebug()<<"htonl:"<<htonl(0xaaeeeeee);

判断系统种变量高\低字节在前

    #include <stdio.h>
    #include <memory.h> 
    void main()
    {
        int a=10;
        short b;
        memcpy(&b,&a,2);
        printf("%d\n",b);
    }

参考

大端模式和小端模式

发送到串口的数据,串口接收是相反的?

详解C语言的htons函数

大小端及网络字节序

字节顺序的问题(高位在前&低位在前)

如何判断变量在内存中如何放置的?低位在前还是高位在前

高低字节序转换(htonl、ntohl、 htons、ntohs函数)

### 换UDP接收数据的大端字节序到小字节序 在网络编程中,UDP协议通常遵循网络字节序(即大端字节序),这意味着接收到的数据可能需要根据目标系统的本地字节序进行换。如果目标系统使用的是小字节序,则可以通过特定函数完成这一换。 #### 使用C/C++实现字节序换 在C/C++中,可以利用标准库中的`ntohs()`和`ntohl()`函数来将网络字节序(大端换为本机字节序(可能是小)。这些函数分别用于16位整数和32位整数的换[^1]。 以下是具体的代码示例: ```c #include <arpa/inet.h> // 包含ntohs和ntohl定义 // 假设从UDP接收到一个uint32_t类型的数值 uint32_t network_order_value = ...; // 接收自UDP的数据 // 将其从大端字节序换为小字节序 uint32_t host_order_value = ntohl(network_order_value); // 对于16位整数的情况 uint16_t network_order_short = ...; uint16_t host_order_short = ntohs(network_order_short); ``` 上述代码片段展示了如何针对不同大小的整型变量执行字节序换[^1]。 #### Python中的字节序换方法 对于Python开发者来说,可以借助内置模块`struct`来进行类似的换操作。下面是一个简单的例子说明如何处理来自UDP的数据流并将其从小回至适合当前机器使用的格式: ```python import struct # 假定data是从socket.recvfrom()获得的一个四字节数组表示int值 packed_data = b'\x00\x01\x02\x03' # 解包成主机字节序下的integer (假设是little endian) unpacked_int, = struct.unpack('<I', packed_data) print(unpacked_int) # 输出应该是按照小解释的结果 ``` 这里的关键在于指定正确的解码指令符给`struct.unpack()`;其中`<`代表强制使用模式解析二进制字符串[^2]。 #### 特殊情况讨论——浮点数及其他复杂结构体 需要注意的是,某些特殊情况下即使是在同一硬件平台上也可能存在差异。比如部分处理器上的IEEE754单精度或双精度浮点数虽然整体上遵照LE布局但内部组成部分仍按BE排列[^3]。因此涉及到更复杂的复合类型时需格外小心验证每一步骤的行为是否符合预期。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHT0506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值