TinyOS: Как я могу преобразовать uint_16 в два целых числа uint_8 (шифрование AES)
Я использую компонент осциллографа для чтения данных датчика. Я отправляю эти данные на узел базовой станции, который отправляет данные на ноутбук.
Я хочу реализовать шифрование AES для данных датчика, используя компоненты, представленные здесь: http://tinyos.cvs.sourceforge.net/viewvc/tinyos/tinyos-2.x-contrib/crypto/index.html
Мой план состоит в том, чтобы уменьшить буфер данных с 10 до 8 в Oscilloscope.h. Это изменяет общий размер данных до 128 бит (такой же, как размер блока в AES). Теперь единственной проблемой является то, что каждый элемент массива в блоке AES - это unit_8, но элементы массива буфера данных - это uint_16.
Могу ли я в любом случае "разделить" значение uint_16 на верхний и нижний биты? Затем я бы сохранил их как 2 элемента в моем блочном массиве AES.
Чтобы уточнить, у меня есть uint_16, который соответствует некоторым данным, считанным датчиком. Я хочу иметь возможность хранить это значение в 2 значениях uint_8. Затем я зашифрую блок данных, отправлю пакет на базовую станцию, а базовая станция расшифрует и объединит значения с исходным uint_16.
1 ответ
Конечно, просто храните младшие восемь бит в одной переменной, а старшие восемь - в другой
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
, но это достаточно широко, то.