1

nthol機能のない8ビットデバイスと通信する必要があります。プロトコルバッファライブラリを使用することもできません。

次のC関数は、実行されているアーキテクチャに関係なく同じ出力文字列を生成します(異なるエンディアン、異なるビット数)。

void encode(uint32_t input, unsigned char* buf, int buf_len) {
  assert(sizeof(uint32_t) <= buf_len);
  buf[0] = input >> 24 & 0xFF;
  buf[1] = input >> 16 & 0xFF;
  buf[2] = input >> 8 & 0xFF;
  buf[3] = input & 0xFF;
}

次の関数は、そのようなエンコードされた文字列を正しく読み取り、すべてのアーキテクチャで同じ結果を生成します。

void decode(const unsigned char* buf, int buf_len, uint32_t* output) {
  assert(sizeof(uint32_t) <= buf_len);
  *output = buf[0];
  *output <<= 8;
  *output |= buf[1];
  *output <<= 8;
  *output |= buf[2];
  *output <<= 8;
  *output |= buf[3];
}

8ビットプロセッサで32ビット整数が何らかの理由で正しく処理されない可能性はありますか?

4

2 に答える 2

1

はい、動作します。C シフト演算子は、マシンのエンディアンやワード サイズに関係なく、正しいことを行います。

このプロトコルと通信するすべてのプログラムでまったく同じことを行うことを忘れないでください。

于 2012-09-21T07:29:19.363 に答える
1

はい、問題ないようです。いくつかのコメント:

  1. コードがその事実に依存している場合は、8 ビットでuint8_tあると仮定する代わりに使用する必要があります。unsigned char
  2. outputローカル変数を使用して受信を行う方が少しクリーン (imo) になるため、ポインターを常にシフトする必要はありません。
  3. おそらく、デコードされた値を返すだけで、decode()関数を少しきれいにすることができます。

-

 uint32_t decode(const uint8_t *buf, size_t buf_len) {
   uint32_t out = 0;
   assert(sizeof out <= buf_len);
   out |= buf[0];
   out <<= 8;
   out |= buf[1];
   out <<= 8;
   out |= buf[2];
   out <<= 8;
   out |= buf[3];
   return out;
 }
于 2012-09-21T07:42:29.433 に答える