利用memcpy进行大小端(高低位)转换

利用memcpy进行大小端(高低位)转换

  • 举例说明

    • 例子1:将 uint8_t buf[4] 合并成 uint32_t value;
      uint32_t value;
      uint8_t buff[4] = {0x11, 0x22, 0x33, 0x44};
      memcpy(&value, buff, 4);
      
      上述代码运行完后,得到 value 的值将是 0x44332211;

    • 例子2:将 uint32_t value 分解成 uint8_t buf[4];
      uint32_t value = 0x11223344;
      uint8_t buff[4] ;
      memcpy(buff, &value, 4);
      
      上述代码运行完后,得到
      buff[0] = 0x44;
      buff[1] = 0x33;
      buff[2] = 0x22;
      buff[3] = 0x11;
  • 如果有帮助到你,敢不敢,点个赞再走?φ(゜▽゜*)♪

### 使用 `memcpy` 实现大小端数据字节序转换 在网络编程中,当涉及到跨平台的数据交换时,不同机器可能采用不同的字节序(即大端或小端)。为了确保数据的一致性和正确性,通常需要将本地字节序转换为网络字节序(通常是大端),然后再由接收方将其转换回主机字节序。 #### 示例代码展示 下面是一个完整的 C 语言程序示例,展示了如何利用 `htons`, `htonl` 函数来处理整数类型的大小端转换,并通过 `memcpy` 进行内存复制: ```c #include <stdio.h> #include <arpa/inet.h> /* for htonl(), ntohl() */ #include <string.h> struct Data { char buf[2]; int a; }; int main() { struct Data DATA; // 初始化临时缓冲区和结构体成员变量 char tmp_buf[2] = {0x10, 0x11}; int data = 0x12345678; // 复制字符数组至结构体内存区域 memcpy(DATA.buf, tmp_buf, sizeof(tmp_buf)); // 将整形数值转成网络字节顺序 (大端) DATA.a = htonl(data); // 创建目标缓存用于保存整个结构的内容 unsigned char outputBuffer[sizeof(struct Data)] = {0}; // 把结构体内容拷贝到新的缓冲区内 memcpy(outputBuffer, &DATA, sizeof(DATA)); // 打印最终结果以验证转换效果 printf("After conversion:\n"); for (size_t i = 0; i < sizeof(DATA); ++i) { printf("%02X ", outputBuffer[i]); } } ``` 这段代码首先创建了一个包含两个字段的结构体:一个是长度为2的字符数组 `buf[]` ,另一个是整型变量 `a`. 接着初始化这些字段并调用 `htonl()` 来把整数从主机字节序转变为网络字节序。最后使用 `memcpy()` 方法将修改后的结构体对象复制到了一个新的无符号字符数组 `outputBuffer[]` 中以便于查看实际存储情况[^1]. 对于更复杂的情况,比如 IP 数据包头部加上有效载荷等场景,则可以按照相同的原则操作各个部分的数据项,只是需要注意保持各段之间的相对位置不变以及遵循协议规定的格式要求[^2]. 同样地,在这种情况下也可以借助 `memcpy()` 完成必要的拼接工作.
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力的小肥丸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值