首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TinyOS:如何将uint_16转换为两个uint_8整数(AES加密)

TinyOS:如何将uint_16转换为两个uint_8整数(AES加密)
EN

Stack Overflow用户
提问于 2012-12-01 19:40:17
回答 1查看 659关注 0票数 1

我正在使用Oscilloscope组件读取传感器数据。我正在把这些数据发送给一个基地卫星,它正在把数据发送到一台笔记本电脑上。

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

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

有没有什么办法可以将uint_16值‘拆分’成高位和低位?然后,我会将它们作为2个元素存储在我的AES块数组中。

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

EN

回答 1

Stack Overflow用户

发布于 2012-12-01 19:42:59

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

代码语言:javascript
复制
unit8_t low = value & 0xFF;
uint8_t high = (value >> 8) & 0xFF;

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

要从各个部分检索uint16_t值,您需要一个shift和一个按位or,

代码语言:javascript
复制
uint16_t reassembled = ((uint16_t)high << 8) | low;

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13659073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档