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

这是我的任务摘录:



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


老实说,我完全不知所措。我整夜都在努力,但我几乎还没有取得进展。

最佳答案

将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;
    }
}

关于c - 隐写程序中的按位运算(C),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10105803/

10-10 15:37