-1

デコーダーに問題があり、誰か助けてくれるかどうか疑問に思っていましたか?

基本的に、ステガノグラフィーエンコーダー用のデコーダーを構築しようとしています。エンコーダーは、メッセージからのビットをサウンドファイルのすべてのバイトの LSB に配置します。

デコーダーの仕事は、それらのビットを集めて、それらから新しいメッセージを作成することです

このコードは、次のことを行うためのものです。

コード: すべて選択

  • メッセージ配列の場所に移動します。

  • bitindex を 0 に設定し、7 までインクリメントします // (8 ビットを 1 バイトに)

  • サウンドアレイの場所に移動

  • サウンドビットが等しい場合は、新しいバイトに 0 を追加します。そうでない場合は、新しいバイトの末尾に 1 を追加します

  • 左にビットシフトを 1 回実行する

  • ビットインデックスをインクリメントする

さまざまな を使用printfすると、クラッシュする前に約 3/4 回スムーズに実行されることがわかります。

実際のループは次のようになります。

 {


int mIndex, sIndex, bitIndex, mask;
char *message[9];

mask = 1;
mIndex = 0;


unsigned char *soundFile = LoadWavAudioFile("boomedit.wav");

int soundFileSize = GetSizeOfWavFile();



bitIndex = 0;

    for(mIndex = 0; mIndex < 8; mIndex++)//index for message
    {
        printf("1\n");
        for(sIndex = 0; sIndex < soundFileSize; sIndex++)//index for soundfile
        {
            printf("2\n");
            for(bitIndex = 0; bitIndex < 8;)
            {
                printf("3\n");
                int test;
                if((soundFile[sIndex] & mask) > 0)//is message bit > 0
                {                                   
                    printf("++++++++++++++++\n");
                    *message[mIndex] = (soundFile[sIndex] | 1);//adds a one to message byte
                    *message[mIndex] = *message[mIndex] <<1;    //shift bits 1 placce left
                    printf("*****************\n");

                }
                else
                { //no change the LSB to 0
                    printf("------------------\n");
                    *message[mIndex]= soundFile[sIndex] & 254; //adds a zero at end o
                    *message[mIndex] = *message[mIndex] <<1; //shifts bits 1 place to left
                    printf("******************\n");
                }

                bitIndex++;
            }   
        }
    }

printf("\n hiddden letters:%s\n", *message); //print message    
printf("\nalert 5\n");

}

何かに役立つことを願っています。

4

2 に答える 2

1

問題はここにあります:

char *message[9];

文字への 9 つのポインターの配列を作成しました。それらに値を割り当てたり、メモリを割り当てたりしません。それらは初期化されていません。

最初に行うことは、これらの初期化されていないポインターの 1 つを参照することです。

*message[mIndex] =

したがって、クラッシュします。


編集:

次の方法ですべてNULLの sに初期化できます。

char *message[9] = {0};

しかし、それを使用することはできません。NULL ポインターを逆参照する際にエラーが発生するだけではありません。これらを有効にするには、メモリを割り当てる必要があります。たとえば、次のようにします。

message[0] = malloc(100); // I don't know how much you need for your strings
message[1] = malloc(100); // that's up to you, so I'm just arbitrally picking 100 bytes
message[2] = malloc(100); // here to illustrate the point.
message[3] = malloc(100);
message[4] = malloc(100);
message[5] = malloc(100);
message[6] = malloc(100);
message[7] = malloc(100);
message[8] = malloc(100); 

完了したら、それぞれを解放する必要があります。これはあなたが欲しかったですか?文字列の配列?

この行:

printf("\n hiddden letters:%s\n", *message); //print message 

私には、あなたが本当に 1 つの文字列だけを求めていたことがわかります...

于 2012-12-12T16:28:26.417 に答える
0

投稿するコードでは、最初のステートメントに到達したときにsIndex等しくなります。ここからは、配列の最後を 1 つ過ぎて読んでいるように見えます。(配列のサイズが実際にあると仮定します)soundFileSizeifsoundFilesoundFileSize

于 2012-12-12T15:40:25.790 に答える