1

比較的大きな既存のコードベースのコードを調べていると、次の関数が見つかりました。

int write_actual_size(unsigned int actual_size, int &out_size)
{
  unsigned char second;
  unsigned char third;
  unsigned char fourth;
  int result;
  int usedBytes;

  *(unsigned char *)out_size = actual_size | 0x80;
  if ( actual_size < 0x80 ) {
    *(unsigned char *)out_size = ((unsigned char)actual_size | 0x80) & 0x7F;
    result = 1;
  } else {
    second = (actual_size >> 7) | 0x80;
    *(unsigned char *)(out_size + 1) = second;
    if (actual_size < 0x4000) {
      *(unsigned char *)(out_size + 1) = second & 0x7F;
      usedBytes = 2;
    } else {
      third = (actual_size >> 14) | 0x80;
      *(unsigned char *)(out_size + 2) = third;
      if (actual_size < 0x200000) {
        *(unsigned char *)(out_size + 2) = third & 0x7F;
        usedBytes = 3;
      }
      else {
        fourth = (actual_size >> 21) | 0x80;
        *(unsigned char *)(out_size + 3) = fourth;
        if (actual_size < 0x10000000) {
          *(unsigned char *)(out_size + 3) = fourth & 0x7F;
          usedBytes = 4;
        }
      }
    }
    result = usedBytes;
  }
  return result;
}

これは、元の入力サイズに応じて、通常の符号なし整数を 1 バイト以上にエンコードします。

私が理解しているように、左端のビットは「フォローアップ」バイトがあるかどうかを判断するために使用されます。これの理由は、帯域幅を節約するためだと思います (パケットあたり最大 3 バイトであっても)。これらの仮定は有効ですか?

read_actual_size バージョンを作成したい...「0」に遭遇するまで、すべてのバイトを直線的に「右に 7 シフト」できますか?

あまり厳しくしないでください、私はCにまったく慣れていません。

4

1 に答える 1