c++ - 在arduino中将字节数组转换为位
问题描述
我有这个数组:
byte addr[5] = {0x56,0x5A, 0x11, 0x40, 0xBE};
如何将其转换为0x565A1140BE
Arduino?
解决方案
最简单的方法是从字节构造值
byte addr[5] = {0x56,0x5A, 0x11, 0x40, 0xBE};
uint64_t value = ((uint64_t)addr[0] << 32)
| ((uint64_t)addr[1] << 24)
| ((uint64_t)addr[2] << 16)
| ((uint64_t)addr[3] << 8)
| ((uint64_t)addr[4] << 0);
您也可以直接将字节视为一个uint64_t
值。这可能要快得多,但这取决于字节序,尽管 Arduino 编译器通常使用小字节序
uint64_t value = 0;
byte addr[5] = {0x56,0x5A, 0x11, 0x40, 0xBE};
// Copy the 5 bytes to the low bytes of the big endian value
memcpy((char*)&value + 3, addr, 5);
// The high 3 bytes will remain zero because we already initialized `value` to 0
#ifdef LITTLE_ENDIAN
value = __builtin_bswap64(value); // reverse endian
#endif
如果数组长度为 8 字节,则只需复制整个 8 字节,无需先初始化为 0
memcpy((char*)&value, addr, 8);
推荐阅读
- swift - Swift Sourcery:如何获取特定的关联类型?
- php - 合并多个 woocommerce 我的帐户选项卡
- c++ - 如何确定两个优先于重载解析的隐式转换序列?
- android-edittext - Edittext的褪色底部
- elasticsearch - 弹性搜索 - 鹡鸰 - 地理距离
- python - 带有 Groupy Pandas 的循环移位(旋转行)数据框
- r - R中的Tobit回归,而循环回归我的数据没有使用censReg审查
- r - 使用 if else 语句翻译和删除操作
- php - PHP Laravel - 验证 webhook 签名
- java - 当我从图库中选择图像时应用程序崩溃