2011-07-03 13 views
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; 
} 

ピクセルは符号なしの文字です。返り値としてextract()fputc(3)というループがあります。私はこれらのビットからゴミを得るように感じる。これは、私に大型の(1.5ギガ)txtファイルを返す原因となります。あなたはオリあなたはすぐにそれを上書きしている指摘するように、カウントを保持するために、静的なVARを使用しようとしている間ので、[編集] -

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); 

} 
+5

ステノグラフィーまたは**ステガノグラフィー**? –

+2

抽出を呼び出すループを表示します。画像を正しくループしていることを示す必要があります。 – borrible

+0

@borribleループを含めました –

答えて

2

あなただけ実際に画像の最初のピクセルを読んでいます。

代わりに、位置を使用してカウントをトラッキングします。しかし、別のVARにデータを保持:

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

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

    pixel data = image[position]; 

    postion++; 

    // use 'data' for processing 
} 
+0

これは赤いニシンです。 OPは即座に 'position'を' * image'で上書きします... –

+0

@Oli:確かに;あなたのコメントごとに更新されました。 – DaveR

+0

@Daveメモリアクセスエラーが発生しました。 –

2

デイブ・リグビーさんexcellent diagnosisは正しいのですが、(ここでそれをインクリメントし、ない)パラメータとして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()ルーチンにできますが、最小の、最も有用な、粉々に機能を分解します優れた読みやすさ、優れたテスト容易性、将来のコード再利用の可能性を提供します。

関連する問題