c - 如何以小端顺序C发送数据
问题描述
我正在与需要我发送 2 个有符号字节的电路板通信。
我需要按位操作还是可以只发送 16 位整数,如下所示?
int16_t rc_min_angle = -90;
int16_t rc_max_angle = 120;
write(fd, &rc_min_angle, 2);
write(fd, &rc_max_angle, 2);
解决方案
int16_t
具有正确的大小,但可能是也可能不是正确的字节序。为了确保小端顺序使用宏,例如来自endian.h的宏:
#define _BSD_SOURCE
#include <endian.h>
...
uint16_t ec_min_angle_le = htole16(ec_min_angle);
uint16_t ec_max_angle_le = htole16(ec_max_angle);
write(fd, &ec_min_angle_le, 2);
write(fd, &ec_max_angle_le, 2);
这里htole16
代表“host to little endian 16-bit”。它将主机的本机字节序转换为小字节序:如果机器是大字节序,则交换字节;如果它是小端,则它是无操作的。
另请注意,您将值的地址传递给write()
,而不是值本身。遗憾的是,我们不能内联调用和 write write(fd, htole16(ec_min_angle_le), 2)
。
推荐阅读
- amazon-web-services - 如何从 AWS VPC 获取可用子网?
- javascript - 如何在 Vuejs 中插入 Echarts?
- node.js - 带有 Typescript 的 NodeJS 中的“TypeError:不是函数”
- mysql - 登录时mysql server 8.0 keyring迁移错误
- java - JPA / Hibernate - NamedEntityGraph 中的子类子图被忽略
- html - CSS Flex 基础孙子
- python - 使用python接收高速率的UDP数据包
- sql - PL/SQL 代码中的布尔变量声明和使用有什么问题?
- sql - SQL Server XML 查询
- javascript - 如何将具有多个同名输入的数据插入数据库?