首页 > 解决方案 > 在arduino中将字节数组转换为位

问题描述

我有这个数组:

byte addr[5] = {0x56,0x5A, 0x11, 0x40, 0xBE};

如何将其转换为0x565A1140BEArduino?

标签: c++arduinobytebit

解决方案


最简单的方法是从字节构造值

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);

推荐阅读