1

我正在使用示波器组件来读取传感器数据。我正在将此数据发送到基站节点,基站节点将数据发送到笔记本电脑。

我想使用此处提供的组件对传感器数据实施 AES 加密:http: //tinyos.cvs.sourceforge.net/viewvc/tinyos/tinyos-2.x-contrib/crypto/index.html

我的计划是在 Oscilloscope.h 中将数据缓冲区从 10 减少到 8。这会将总数据大小更改为 128 位(与 AES 中的块大小相同)。现在唯一的问题是AES块中的每个数组元素是一个unit_8,但是数据缓冲区的数组元素是uint_16。

无论如何我可以将 uint_16 值“拆分”为高位和低位吗?然后我会将它们作为 2 个元素存储在我的 AES 块数组中。

为了澄清,我有一个 uint_16 对应于传感器读取的一些数据。我希望能够将此值存储在 2 个 uint_8 值中。然后我将加密数据块,将数据包发送到基站,基站将解密并将值组合到原始 uint_16。

4

1 回答 1

3

当然,只需将最低有效八位存储在一个变量中,并将最高有效八位存储在另一个变量中

unit8_t low = value & 0xFF;
uint8_t high = (value >> 8) & 0xFF;

(按位和在这两种情况下都是多余的,因为uint8_t指定转换为相同)。

要从零件中检索uint16_t值,您需要移位和按位或,

uint16_t reassembled = ((uint16_t)high << 8) | low;

由于整数提升是在移位运算符的参数上执行的,uint16_t如果int大于 16 位宽,则不需要强制转换,但如果int正好是 16 位宽,则移位可能导致未定义的行为,因为值high*256不需要可表示然后,int为了安全起见,轮班前需要进行演员表。如果int是 16 位宽,uint16_t则从转换获得的值将被转换为unsigned int- 除非你有一个不正当的实现,其中的宽度unsigned int小于int- 的宽度,否则转换为int,但这已经足够宽了。

于 2012-12-01T11:42:59.337 回答