3

私はステガノグラフィで遊んでいます。画像からテキストファイルをプルしようとしています。ファイルを読み取ってビットを取得することはできますが、これらのビットの抽出に問題があります。

int getbits( pixel p) {
    return p & 0x03;   
}

char extract ( pixel* image ) {
    static int postion;
    postion = 0;

    postion = *image;

    postion++;

    char curChar;
    curChar = '\0';
    for(int i = 0; i<4; ++i) {
        curChar = curChar << 2;
        curChar = curChar | getbits(postion);
    }
    return curChar;
}

Pixelはunsignedcharです。extract()呼び出しとfputc(3)戻り値をループします。私はこれらのビットからゴミを取得しているような気がします。これにより、大量の(1.5ギガ)txtファイルが返されます。

void decode( PgmType* pgm, char output[80] )
{
FILE*outstream;
int i, length;

outstream = fopen(output, "w");

if(!outstream)
{
    fatal("Could not open");
}
for(i=0; i < 16; ++i)
{
    length = length << 2;
    length = length | getbits(*pgm->image);
}
if ((length* 4) < (pgm->width * pgm->height))
{
    fatal("File Too Big");
}
for (i = 0 ;i<length; ++i)
{
    fputc(extract(pgm->image), outstream);

}
fclose(outstream);

}
4

2 に答える 2

2

あなたは実際に画像の最初のピクセルを読んでいるだけです-[編集]静的変数を使用してカウントを維持しようとしている間、Oliが指摘しているように、すぐに上書きしているからです。

代わりに、位置を使用してカウントを追跡します。ただし、データを別の変数に保持します。

代わりにextract()、次のようになります。

char extract ( pixel* image )
{
   static int postion = 0;

   pixel data = image[position];

   postion++;

   // use 'data' for processing
}
于 2011-07-03T20:59:26.953 に答える
2

Dave Rigbyの優れた診断は正しいですがposition、パラメーターとして渡す(ここではインクリメントしない)と、理解しやすく、より柔軟なルーチンになります。

char extract ( pixel* image, int position ) {
    char curChar = '\0';
    for(int i = 0; i<4; ++i) {
        curChar = curChar << 2;
        curChar = curChar | getbits(postion);
    }
    return curChar;
}

char *build_string(pixel *image) {
    int i;
    char *ret = malloc(SECRET_SIZE);
    for (i=0; i<SECRET_SIZE; i++) {
        ret[i]=extract(image, i);
    }
    ret[i] = '\0';
    return ret;
}

次に、行のすべてのピクセルを変更すると非常に明白になり、フィボナッチ値にあるピクセルを使用したい場合は、変更を簡単に行うことができます。

char *build_string_via_fib(pixel *image) {
    int i;
    char *ret = malloc(SECRET_SIZE);

    for (i=0; i<SECRET_SIZE; i++) {
        ret[i]=extract(image, fib(i));
    }
    ret[i]='\0';
    return ret;
}

フィボナッチの計算をルーチンに詰め込むこともできextract()ますが、関数を最小で最も有用な部分に分解すると、優れた読みやすさ、優れたテスト容易性、および将来のコード再利用の可能性が最も高くなります。

于 2011-07-03T21:18:54.557 に答える