bugfix> c > 投稿

私はC言語を使用してIJVMプロジェクトに取り組んでいます。 まず、バイナリファイルをプログラムにインポートしました。これは単語として解析する必要があります。 ここで、バイナリを含む変数(テキスト)を作成し、それを単語の配列に変換する必要があります。ヒントを得た

   int result = ((bytes[0] & 0xFF) << 24) |
    ((bytes[1] & 0xFF) <<16) |
    ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);

これは最初の4バイトでのみ機能しました。必要なのは result の配列です 。

私はこのようなものを試してみましたが、うまくいきませんでした.. :(

void type_converter(byte_t* text)
{
  for (int i = 0; i < sizeof(text)/4; i++) {
    for (int j = 0; i < sizeof(text)/4; i++) {
      int result[i] = ((text[j+0] & 0xFF) << 24) |
      ((text[j+1] & 0xFF) << 16) |
      ((text[j+2] & 0xFF) << 8) | (text[j+3] & 0xFF);
      instruction[i] = result;
      j =+ 4;
    }
  }

回答 1 件
  • OPのコードサンプルについて:

    内側のループは意味がありません(または、意図が理解できませんでした)。

    外側のループ、次のように変更します: for (int i = 0; i + 3 < size; i += 4) 。 、 i + 3 に注意してください 。これにより、バッファの終わりの部分的なバイトに対してループが安全になります。ザ・ i += 4  4バイトのジャンプで適切なステップを実行します。

    ザ・ size  あなたが提供しなければならないものです。マーティンがすでに述べたように: sizeof text  ポインターのサイズを提供します。オペレータがこれを判断する機会はありません(元の配列に直接アクセスできない場合)。パラメーター size を作成する必要があります  このため。 (これはCプログラムで非常に一般的なソリューションです。)

    ところで result の宣言はありません  または instruction 。したがって、それらの1つを関数の別のパラメーターとして作成します。

    したがって、変更関数は次のようになります。

    void type_converter(uint32_t *result, byte_t *text, size_t size)
    {
      for (size_t i = 0; i + 3 < size; i += 4) {
        result[i / 4]
          = ((text[i+0] & 0xFF) << 24)
          | ((text[i+1] & 0xFF) << 16)
          | ((text[i+2] & 0xFF) << 8)
          | (text[i+3] & 0xFF);
        }
      }
    }
    
    

    そして、どうか、 result を忘れないでください   size / 4 に十分なストレージを提供する必要がある   uint32_t  言葉。


    過去に似たようなことをしたことを思い出したので、 i + 3 を防ぐためにこれを少し変更することができます  ループ状態:

    void type_converter(uint32_t *result, byte_t *text, size_t size)
    {
      for (size_t i = 3; i < size; i += 4) {
        result[i / 4]
          = ((text[i-3] & 0xFF) << 24)
          | ((text[i-2] & 0xFF) << 16)
          | ((text[i-1] & 0xFF) << 8)
          | (text[i] & 0xFF);
        }
      }
    }
    
    

    wandboxのライブデモ

    注意:

    この種のバイトの組み合わせは、ビッグエンディアンの数値(最初の位置の最上位バイト)向けであることがわかりました。リトルエンディアンの場合、インデックスを並べ替える必要がありました。

あなたの答え