3

我用 Bmp 图像用 C 语言编写了一个简单的隐写术工具。

我将图像读入内存,文本一次隐藏在 char bytes[8] 中一个字符。

所以例如。

a=0d97
bytes[0] = 0
bytes[1] = 1
bytes[2] = 1
bytes[3] = 0
bytes[4] = 0
bytes[5] = 0
bytes[6] = 0
bytes[7] = 1

然后我将转到第一个图像字节(char *ptr points每次)将字节 [0] 放入 LSB,然后是下一个,依此类推。

如果*ptr=0xff or 0b11111111我必须将最后一个 1 设置为 0。这可以与

*ptr = *ptr ^ 0x01 ;

但是如果*ptr = 0x00or 或0b00000000xor 不起作用,因为0^1=1

我很困惑如何设置案例。如果 LSB 为 1 或 0,我需要一个操作员每次都将最后一位设为 0,并且不要接触其他位。

4

4 回答 4

9

使用此模式将最低有效位设置为位(0 或 1)中的值:

new_value = old_value & 0xFE | bit

AND 将关闭位 0,如果位为 1,OR 将重新打开。

于 2013-11-02T16:56:32.287 回答
8

1 和 x 的 AND 是 x,而 0 和 x 的 AND 是 0。因此,将它与一个除最低有效位之外的所有位都设置为 1 的数字进行与:

*ptr = *ptr & 0xfe;

要将位设置为 1,请注意 0 和 x 的 OR 为 x,而 1 和 x 的 OR 为 1:

*ptr = *ptr | 0x01;
于 2013-11-02T16:53:37.923 回答
1

您可以使用|运算符来设置该位。查看相关帖子以查看更多详细信息:如何设置、清除和切换单个位?.

于 2013-11-02T17:02:06.380 回答
0

最简单的答案是。如果您想将数字中的 lsb 设置为零。如果数字是奇数,Num=num-1。如果是偶数,则它在 lsb 处已经为零。

于 2014-07-16T05:01:20.057 回答