c语言 - 通过修改最低有效位元素来隐藏大型指针数组中的数字



直接我会说我几乎不知道我在这里做什么 - 我在掌握 C 中的按位运算符时遇到了很大的麻烦。 作为我的一门课程的练习,我应该在包含数字的大型指针数组(无符号字符)中隐藏一个数字(无符号 int)。我使用 srand(带键,以便稍后可以解码)来选择数组的特定元素,然后从我应该隐藏的数字中取出一位(遍历所有位)并更改数组元素的最低有效位。选择元素。

虽然我得到了大致的想法,尽管谷歌搜索,但我无法弄清楚位操作。因此,拥有我应该在循环的第 i 次运行中编码的size(i-th位大小)并随机选择current_element这就是我想出的获取位然后更改元素的方法。

for (i=0; i<32; i++){    
tmp = rand() % max;
current_element = array[tmp];
current_element ^= ((size >> i)  & 0x01)<<7;
}

要解码,我会类比地编写它(其中大小被擦除为我试图将解码数字写入的无符号字符):

for (i=0; i<32; i++){
tmp = rand() % max;
current_element = array[tmp];
size = size ^ ((current_pixel.blue<<0)<<7);
}

这两者具有不同的功能,并且事先在它们中重新播种srand()

但是这些显然不起作用,我什至不知道是哪一个(我只能检查它是否正确解码)。说实话,这些大多是从我在网上找到的其他东西中复制的,因为到目前为止,对单个位进行操作对我来说是逃避的。因此,我很感激能就这里的问题提供某种建议(我知道这里可能一切都错了,而且都是胡言乱语,但我一直在尝试修复它

,但无济于事了一段时间)。

我只会间接回答你的问题。我将给你一些许多新程序员需要的温和建议。
如果你想学习编程,停止谷歌搜索和思考。

将问题分解为多个步骤。编写伪代码:

encode:
for each bit in message_word:
select random array element
if bit is set:
toggle LSB of element.
decode:
for each bit in message_word:
select random element
if LSB is toggled:
set bit in message_word

现在,为每个步骤编写 C 代码。 你实际上拥有大部分作品。

// for each bit in message_word
for (i=0;i<sizeof(message_word); i++) {
// select random array element
tmp = rand() % max;
current_element = array[tmp];
// if bit is set:
if ( bit_is_set(message_word,i) ) {
// toggle LSB of element.
toggle_lsb(current_element);
}
}

现在您已经掌握了基本步骤,也许您可以谷歌"如何切换一下"。 但是,在插入之前,请确保您了解答案。

int bit_is_set(word,bit) { return ((word>>bit)&0x01); }
int toggle_lsb(word) { return word ^ 1; }

但是 - 这仍然行不通。 为什么? 是时候再想一想了。 您在随机选择的数组索引处创建了该值的副本。 您在副本中切换了一下。 这将对阵列产生什么影响?

解决了这个问题,至少还有一个挑战。在解码功能中,您将如何实现is_lsb_toggled? 你怎么知道一个给定的位应该是 1 还是 0? 您拥有所需的所有信息。祝你好运。

相关内容

  • 没有找到相关文章

最新更新