1

オシロスコープ コンポーネントを使用してセンサー データを読み取ります。このデータを、データをラップトップに送信しているベースステーション モートに送信しています。

ここで提供されているコンポーネントを使用して、センサー データにAES暗号化を実装したいと考えています。

私の計画は、Oscilloscope.h のデータ バッファを 10 から 8 に減らすことです。これにより、合計データ サイズが 128 ビット (AES のブロック サイズと同じ) に変更されます。唯一の問題は、AES ブロックの各配列要素が unit_8 であるのに対して、データ バッファーの配列要素が uint_16 であることです。

uint_16 値を上位ビットと下位ビットに「分割」できる方法はありますか? 次に、それらを AES ブロック配列に 2 つの要素として格納します。

明確にするために、センサーによって読み取られたデータに対応する uint_16 があります。この値を 2 つの uint_8 値に格納できるようにしたいと考えています。次に、データ ブロックを暗号化し、パケットを基地局に送信します。基地局は、値を復号化して元の uint_16 に結合します。

4

1 に答える 1

3

もちろん、最下位 8 ビットを 1 つの変数に格納し、最上位 8 ビットを別の変数に格納するだけです。

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

(ビットごとの and は、どちらの場合も不要です。これは、への変換がuint8_t同じことを行うように指定されているためです)。

パーツから値を取得するにはuint16_t、シフトとビット単位の OR が必要です。

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

整数昇格はシフト演算子の引数に対して実行されるため、 が 16 ビット幅を超える場合はキャストするuint16_t必要はありませんが、正確に 16 ビット幅である場合、値が表現可能である必要がないため、シフトによって未定義の動作が発生する可能性があります。安全のために、シフトの前にキャストが必要です。が 16 ビット幅の場合、キャストから取得された は-に変換されます。intinthigh*256intintuint16_tunsigned intunsigned intintint

于 2012-12-01T11:42:59.337 に答える