直接我会说我几乎不知道我在这里做什么 - 我在掌握 C 中的按位运算符时遇到了很大的麻烦。作为我的一门课程的练习,我应该隐藏一个数字(无符号整数)在包含数字的大指针数组(无符号字符)中。我正在使用 srand(带有密钥,以便我以后可以对其进行解码)来选择数组的特定元素,然后取出我应该隐藏的数字的一位(遍历所有位)并更改数组元素的最低有效位。选择元素。
虽然我得到了大致的想法,但尽管使用谷歌搜索,但我无法弄清楚位操作。因此size
,我应该在循环的第 i 次运行中进行编码(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?您拥有所需的所有信息。祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句