3

我对 C 和按位运算都比较陌生,而且我在课堂上分配的作业遇到了麻烦。大部分代码已提供给我,但我一直在找出与按位运算有关的部分时遇到问题。一旦我弄清楚这部分,我会很高兴。我希望有人能帮忙!

以下是我的作业节选:

您将需要使用 8 个字节的图像来隐藏 1 个字节的信息(请记住,只能修改封面图像的 LSB)。您将使用封面图像的其余 16 个字节来嵌入 b.size 的 16 位(二进制数据的大小字段的两个最低有效字节),接下来的 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 回答