【问题标题】:Hiding number in large pointer array by modifying least significant bit of elements通过修改元素的最低有效位来隐藏大指针数组中的数字
【发布时间】:2019-02-25 14:55:59
【问题描述】:

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

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

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

要解码,我会类比地写它(其中大小是我试图将解码后的数字写入的 unsigned char):

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

    }

这两个函数具有不同的功能,srand() 预先在每个函数中重新播种。

但是这些显然不起作用,我什至不知道是哪一个(我只能检查它是否正确解码)。说实话,这些主要是从我在网上找到的其他东西中复制而来的,因为到目前为止我还没有对单个位进行操作。因此,我将不胜感激有关这里出了什么问题的某种建议(而且我知道这里可能一切都错了,而且都是胡言乱语,但我一直在尝试修复它已经有一段时间了,但无济于事)。

【问题讨论】:

  • 你的问题太宽泛了,看起来更像是一个家庭作业转储而不是一个真正的问题。如果您不了解按位运算,请隔离问题的特定部分,尽您所能编写代码,展示您的努力,然后人们会非常乐意为您提供帮助。
  • 另外,想想位运算符的哪些方面困扰着您,并专门询问这些方面。或者搜索那些——如果你正在寻找特定的东西,你更有可能找到你正在寻找的东西。甚至可以考虑阅读教科书的相关部分并复习课堂笔记。
  • 不,这是一个更大的程序的一部分,我正在尝试使用图像中的密钥编写、编码和解码秘密消息 - 不幸的是,我需要了解三件事 - 如何隔离一个特定的位,然后如何更改最后一位,然后在形成时如何将不同的位相加。我没有可以浏览的教科书,因为我没有课本,而且由于我们的讲师并不完全好,他只浏览了这个主题,因此缺乏课堂笔记和讲座。不过,谢谢你,我会尝试更多实验并找出问题所在。

标签: c bit-manipulation bitwise-operators


【解决方案1】:

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

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

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

现在您已经了解了基本步骤,也许您可​​以在 Google 上搜索 "how to toggle a bit"。但请确保您在插入之前了解答案。

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

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

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

【讨论】:

  • “如果你想学习编程,停止谷歌搜索并思考。”为此 +100。
猜你喜欢
  • 2014-04-07
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多