3

私は C 演算とビット演算の両方に比較的慣れておらず、クラスで与えられた課題に問題があります。コードの大部分は私に渡されましたが、ビット演算に関連する部分を理解するのに問題がありました。この部分を理解したら、私は金になります。誰かが助けてくれることを願っています!

これが私の課題からの抜粋です:

1 バイトの情報を隠すには、画像の 8 バイトを使用する必要があります (カバー画像の LSB のみを変更できることに注意してください)。カバー画像の残りの 16 バイトを使用して、b.size の 16 ビット (バイナリ データのサイズ フィールドの最下位 2 バイト) を埋め込みます。カバーの次の 32 バイトは、ファイル拡張子を埋め込むために使用されます。その後、8*b.size バイトを使用してペイロード (b.data) を埋め込みます。

このプログラムが行っているのは画像の速記であり、作成したファイルのデータを使用して、読み取った画像の最下位ビットを変更する必要があります。私が言ったように、そのためのすべてのコードはすでに書かれています。LSB を変更する方法がわかりません。どんな助けでも大歓迎です!!!

LSB の再フォーマットに使用する関数は次のとおりです。

byte getlsbs(byte *b);
void setlsbs(byte *b, byte b0);

これは私がこれまでに試みたものです:

/* In main function */
b0 = getlsbs(&img.gray[0])

/* Passing arguments */
byte getlsbs(byte *b)
{
    byte b0;
    b0[0] = b >> 8;
    return b0;
}

私は正直なところ、完全に途方に暮れています。私は一晩中これに取り組んできましたが、まだほとんど前進していません。

4

1 に答える 1

4

b の LSB を 1 に設定するには:

b |= 1;

b の LSB を 0 に設定するには:

b &= 0xFE;

これは、機能を実装する方法のアイデアです。このコードはテストされていません。

byte getlsbs(byte *b)
{
    byte result = 0;
    for (int i = 0; i < 8; ++i)
    {
        result >>= 1;
        if (*b & 1)
            result |=  0x80;
        ++b;
    }
    return result;
}

void setlsbs(byte *b, byte b0)
{
    for (int i = 0; i < 8; ++i)
    {
        if (b0 & 1)
            *b |= 1;
        else
            *b &= 0xFE;
        ++b;
        b0 >>= 1;
    }
}
于 2012-04-11T12:26:59.867 に答える