2012-04-11 65 views
3

我对C和按位操作都比较陌生,而且我在课堂上给予的作业有麻烦。大部分代码已经发给我了,但我一直在解决与按位操作有关的部分问题。一旦我弄清楚了这一部分,我就会变得金黄。我希望有人能帮助!隐写术程序中的按位操作(C)

这里是我的任务摘录:

您将需要使用8个字节的图像来隐藏一个字节的信息(请记住,只有封面图像的最低有效位可以被修改)。您将使用封面图像的16个字节的其余部分嵌入16位b.size(二进制数据的大小字段的两个最低有效字节),封面的下32个字节将用于嵌入文件扩展名 为有效载荷文件,然后您将使用8 * b.size字节来嵌入有效载荷(b.data)。

这是什么程序做的是图像的速记,我不得不修改使用来自我创建了一个文件中读取数据图像的最小显著位。就像我说的那样,所有的代码都已经写好了。我只是无法弄清楚如何修改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; 
} 

我老老实实在一个完全丧失。我一整晚都在为此工作,而且我还没有取得进展。

+0

BTW:[速记](http://en.wikipedia.org/wiki/Stenography)// [隐写术(http://en.wikipedia.org/wiki/Steganography) - 请更正您的发帖 – Mat 2012-04-11 12:24:28

+0

我道歉;我并不是想让它看起来像我试图为我完成它。我所尝试过的所有东西都失败了,因为我似乎无法理解按位运算。在大学生涯中,我从来没有必须和他们打交道。 – JamesClem 2012-04-11 12:29:52

+0

然后发布您尝试的代码,以便人们可以解释您做错了什么。 – Mat 2012-04-11 12:32:58

回答

4

要设置LSB b键1:

b |= 1; 

要设置LSB B至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; 
    } 
} 
+0

+1。虽然我希望OP提到他允许玩的LSB有多少(我不认为它只有1个,因为他使用了'bits'这个词)。 – ArjunShankar 2012-04-11 12:49:20

+0

我很抱歉我没有关注这篇文章;最近我一直忙于其他课程,没有太多时间专注于此课程。我apprecaite的帮助!我会尝试一下,让你知道这是否解决了我的问题。我相信我现在开始更好地理解按位操作。另外,对于上面的海报,我不得不操纵多个字节,但我允许在主函数中使用循环结构来处理这个问题。从外观来看,这可能解决我一直在获取和设置LSB时遇到的问题。 – JamesClem 2012-04-24 05:10:47

+0

您为getlsbs创建的解决方案似乎完美运行,但不幸的是,设置它们似乎没有正常工作。不过,我非常感谢你让我走得这么远。我之前很困难。我会和他们一起玩,看看我能否让他们正常工作 – JamesClem 2012-05-01 06:55:01