- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人可以向我解释一下该算法如何在 32 位系统上将 MSB 转换为 LSB 或将 LSB 转换为 MSB 吗?
unsigned char b = x;
b = ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
我以前在代码中见过以 LU 或 U 结尾的十六进制值,它们是什么意思?
谢谢!
最佳答案
据推测,一个 char
有八位,所以 unsigned char b = x
取 x 的低八位。
带有 0x22110 的掩码提取位 4、8、13 和 17(最低有效位从 0 开始编号)。因此,在乘以 0x0802 时,我们只关心它在这些位上的位置。在 0x802 中,第 1 位和第 11 位打开,因此此乘法放置了 b
的八位的副本。在位 1 到 8 中,另一个副本在位 11 到 18 中。没有重叠,因此在更一般的乘法中添加重叠的位不会产生任何影响。
从这个产品中,我们获取了这些位:
b
的第 3 位. (从第 1 位开始的副本的第 4 位,因此 b
的第 4–1 = 3 位。)b
的第 7 位. (8–1 = 7.)b
的第 2 位. (13–11 = 2.)b
的第 6 位. (17–11 = 6.)类似地,0x88440 的掩码提取位 6、10、15 和 19。与 0x8020 的乘法放置了 b
的副本。在位 5 到 12 中,另一个副本在位 15 到 22 中。我们从这个产品中获取这些位:
b
的第 1 位.b
的第 5 位.b
的第 0 位.b
的第 4 位.然后我们将它们或在一起,产生:
b
的第 3 位.b
的第 1 位.b
的第 7 位.b
的第 5 位.b
的第 2 位.b
的第 0 位.b
的第 6 位.b
的第 4 位.将此结果称为 t
.
我们要把它乘以 0x10101,右移 16,然后赋值给 b
.赋值转换为 unsigned char
,所以只保留低八位。移位后的低八位是移位前的第 24 位到第 31 位。所以我们只关心产品中的第 24 位到第 31 位。
乘数 0x10101 的位 0、8 和 16 已设置。因此,结果中的第 24 位是 t
中第 24、16 和 8 位之和。 ,加上来自其他地方的任何进位。但是,没有进位:观察 t
中没有任何设置位。相隔八个,就像乘法器中的位一样。因此,它们都不能直接贡献于产品中的相同位。乘积中的每一位最多是t
中一位的结果.我们只需要弄清楚那是哪一位。
第 24 位必须来自 t
中的第 8、16 或 24 位.只能设置bit 8,它是b
中的bit 7 .以这种方式推导所有位:
t
中的第 8 位, 这是 b
中的第 7 位.t
中的第 17 位, 这是 b
中的第 6 位.t
中的第 10 位, 这是 b
中的第 5 位.t
中的第 19 位, 这是 b
中的第 4 位.t
中的第 4 位, 这是 b
中的第 3 位.t
中的第 13 位, 这是 b
中的第 2 位.t
中的第 6 位, 这是 b
中的位 1 .t
中的第 15 位, 这是 b
中的位 0 .因此,乘积中的第 24 位到第 31 位是 b
中的第 7 位到第 0 位。 ,所以最终产生的八位是b
中的第7到0位.
关于C MSB 到 LSB 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368887/
如何在c#中用另一个字节的LSB替换一个字节的LSB。 类似这样的 字节1 - 0 1 1 1 1 1 1 1 字节2 - 0 0 1 1 1 0 0 0 现在我希望将 byte1 的 lsb(即“1
我希望将 LSB、MSB 的字节数组转换为 int 的数组 目前,我正在使用 for 循环并单独转换每组值, void ConvertToInt(int OutArray[], byte InArra
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我想分配一个 std_logic_vector 而不给出界限。像这样: constant xy: std_logic_vector := "100111"; 当我想访问单个位时: xy(0), xy(
我检查了用于反转位顺序的 SWAR 算法(SIMD W在 A Rregister 中) unsigned int 的。 signed int 有类似的东西吗? 最佳答案 该算法仅适用于无符号整数,因为
当您使用 LSB 隐写术加密图像时,它会改变一些像素。我的问题是,如果说您使用 ffmpeg 在视频中输入该图像并重新编码视频加上图像,像素是否仍会被更改并且能够被解密? 最佳答案 这取决于编码期间使
我正在尝试更改数值的 LSB,例如 50,其中 LSB 为 0,因为 50 % 2 为 0(余数运算符),值为 1。因此,在这种情况下,将 LSB 从 0 更改为 1。代码如下: //Get the
我正在尝试实现一个简单的编码程序,可以在图像像素的 LSB 中隐藏消息。到目前为止,我已经从消息中获取了字节数组 private static byte[] ConvertMessageToB
当你和一些带有掩码的数据时,你会得到一些与数据/掩码大小相同的结果。我想要做的是获取结果中的掩码位(掩码中有 1)并将它们向右移动,以便它们彼此相邻,我可以对它们执行 CTZ(计数尾随零) . 我不知
我正在尝试实现一种基本的速记技术,其中我用消息图像的 MSB 替换载体图像的 LSB。 LSB 可以属于任何 RGB channel 。 我的方法非常幼稚,因为我正在循环 message_matrix
我尝试在 C 中这样做: int val = 0xCAFE; int uc = val & 14; if (val & 15 == 15 || val & 7 == 7 || val & 11
更新************************作为引用,我包含了用于打开 PPM 图像的程序 - 将消息嵌入到图像中,然后保存带有嵌入文本的新图像。通过下面的函数,我希望额外添加该消息(隐藏在
我只是想知道是否有人可以帮助我设置/清除音频样本的 LSB 下面的代码遍历一个包含 24 个元素的数组,每个元素都添加到文件中,并在后面添加一个新行。 FILE *fp; fp = fopen(Emb
我知道使用 LSB 意味着您可以将消息存储在图像载体大小的 12% 左右。 我制作了一个 java 程序,它将一条消息分成 n 个片段,并用这些片段填充图像载体,直到 12% 都被占用。我这样做是为了
我有一个来自 GTK/glib 2 的 GSList,它们只存储完整的指针,我真的不想要额外的分配。我如何进行位操作以在这些指针中存储额外数据? 我想我不能只拿一个指针然后做 tagged_ptr =
我在网上读到了LSB插入,但它只介绍了如何向LSB插入位,但没有描述如何提取位。这是我读过的关于LSB insertion的文章. 我理解他们下面使用的方法,但是如何提取这些位? 最佳答案 这是获取加
我有一个函数返回 1 Byte uint8_t fun(); 该函数应该运行 9 次,所以我得到 9 字节 我想将最后一个 8 作为 4 short values 这里我所做的,但是我'我不确定我得到
我的程序从硬件设备接收一个字节类型的日期时间数据包。一个示例数据包是: byte[] packet = new byte[] {0x0C, 0x01, 0x15}; //packet[0] is th
我很难理解 LSB based steganography第 2 节中给出的方法。互联网上的示例非常困惑和不清楚。我正在关注 Matlab 实现 https://www.mathworks.com/m
我有一个二进制文件,我需要了解它并修改它的行为,但我以前从未在 Linux 上重写过某些东西,只是在 Windows 上重写过。有人可以向我推荐一种方法/程序来查看此二进制文件的 ASM、跟踪其运行时
我是一名优秀的程序员,十分优秀!