1

編集:さらに調査を行った後、実際に必要なのはビッグエンディアンからミドルエンディアン、またはその逆のようです。12345678 -> 34127856 と戻ります。混乱して申し訳ありません。

ちょうど16MBの小さなファイルがあります。ファイル全体をバッファに読み込んでいます。私がやろうとしているのは、可能であればファイル/バッファ全体を一度にバイトスワップすることです(たとえば、均一/グローバルスワップADDECEFA => DEADFACE)。私は数え切れないほどのバイトスワッピングのページを読みましたが、ビット単位/バイトスワップの多くは何らかの理由で頭を悩ませています (愚かな脳の可能性が最も高い)。誰かがダミーのビット単位/バイトスワップを知っている場合は、正しい方向に向けてください!

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) 
{

    const char * suffix = ".reversed";

    FILE *input = fopen(argv[1], "rb");
    char * out = strcat(argv[1], suffix);
    FILE *output = fopen(out, "wb");

    int data[16384];
    int swapped;

 while(fread(data,sizeof data, 1, input)){

    swapped = ((data & 0x000000FF) << 24) |
              ((data & 0x0000FF00) <<  8) |
              ((data & 0x00FF0000) >>  8) |
              ((data & 0xFF000000) >> 24);

    fwrite(swapped, sizeof data , 1, output);

            /*  by golly it copies the file fast as heck!
                but i am unsure how to manipulate 'data' buffer
                so as it uniformly/globaly swaps ADDECEFA => DEADFACE 
            */
        }
    }

また、私のコードで何か間違ったことをしているのを見たら、教えて、より良い方法を教えてください。何か詳しく説明する必要がある場合は、遠慮なくお尋ねください。ありがとう、良いものを。

編集:失敗した試みの1つを追加しました。私の最終目標は、バイトを outfile に書き戻すときにバイトをスワップし、できるだけ効率的にスワップすることでした。

4

1 に答える 1

1

与えられた

int data[16384];

このコード

while(fread(data,sizeof data, 1, input)){

intから 16,384 個の値を読み取ろうとしますinput。これまでのところ何も問題はありません。

しかし、このコード:

swapped = ((data & 0x000000FF) << 24) |
          ((data & 0x0000FF00) <<  8) |
          ((data & 0x00FF0000) >>  8) |
          ((data & 0xFF000000) >> 24);

は配列の最初の要素のアドレスとして評価されるため、 のバイト スワップされたアドレスに適合する部分を に詰め込もうとします。dataswappeddata

おそらく次のようなものが必要です。

swapped = ((data[ 0 ] & 0x000000FF) << 24) |
          ((data[ 0 ] & 0x0000FF00) <<  8) |
          ((data[ 0 ] & 0x00FF0000) >>  8) |
          ((data[ 0 ] & 0xFF000000) >> 24);

しかし、符号付き の値をシフトするとint実装定義の動作になるという問題があります。符号付き整数の算術ビット シフトを参照してください。

だからあなたはおそらく欲しい

unsigned int data[16384];

ただし、それを考慮しても、交換するint値は 1 つだけです。読み込んだすべてのデータをループし、それぞれを交換するint必要があります。それがあなたがやりたいことだと仮定します。

これにより、別の問題が発生します。コードは、バイトスワップに必要なデータ量を追跡しません。int読み込んだ値の数を数えて使用する必要があります。

最後に、このコード

fwrite(swapped, sizeof data , 1, output);

は、たまたま指し示すアドレスから開始して、 にsizeof dataバイトを書き込みます。しかし、これは の定義です:outputswappedswapped

int swapped;

したがって、そのfwrite()呼び出しは未定義の動作です。

于 2016-12-14T21:58:09.523 に答える