求解按位XOR和ADD方程

时间:2015-06-11 17:03:56

标签: bitwise-operators logical-operators equation-solving bitwise-xor

当然,XOR可以使用两次来恢复原始值。如果原始值是掩码的一部分怎么办?

编码:

e[i] = c[i] ^ (c[i] + c[i-1])

假设:起始值c [-1] = 0,^表示按位XOR

以命令式C形式:

void encode(byte *p, int len)
{
    byte prev = 0;
    for (auto i = 0; i < len; i++)
    {
        auto byt = p[i];
        p[i] = byt ^ (prev + byt);
        prev = byt;
    }
}

如何创建一个解码步骤,将e =&gt; C吗?

我已经简化/澄清(阅读:更改)了我从你的答案中学到的问题!使用与DanL类似的步骤,从原始等式开始:

e[i] = c[i] ^ (c[i] + c[i-1])

e[i] ^ c[i] = c[i] ^ (c[i] + c[i-1]) ^ c[i]
e[i] ^ c[i] = c[i] + c[i-1]
c[i] = e[i] ^ c[i] - c[i-1]
c[i] ^ c[i] = (e[i] ^ c[i] - c[i-1]) ^ c[i]
0 = e[i] ^ c[i] ^ c[i] - c[i-1] ^ c[i]
0 = e[i] - c[i-1] ^ c[i]
c[i-1] ^ c[i] = e[i]
c[i-1] ^ c[i] ^ c[i-1] = e[i] ^ c[i-1]
c[i] = e[i] ^ c[i-1]

???

现在,查看原始编码 - 第一个字节将始终为零(= c [i] ^(c [i] + 0))。所以是的,在集合上必须丢失一个字节。

1 个答案:

答案 0 :(得分:1)

在循环的每次迭代中,您都在有效地计算

c_i = e ^ ( p + c_(i-1) )

如果你想反转循环然后给出一个c_i你需要计算c_(i-1)

然而,正如你所说xoring两次让你回到原始值而xor是一个可交换的操作,所以如果你用上述等式x,那么我们得到

c_i ^ e = e ^ ( p + c_(i-1) ) ^ e

简化为

c_i ^ e = p + c_(i-1)

然后从双方拿走p给你

(c_i ^ e) - p = c_(i-1)

因此在你的“逆转”循环中

你想要代码

c = (c ^ e) - p

编辑:在上下文中看到带有代码的修改后的问题后,我不相信这是可能的,因为我相信mix函数有效地将len字节数组映射到len-1字节数组。

我相信这是因为以下论点:

将未混合数组调用为unmixed,混合数组应用混合函数后称为混合

mixed[0] = unmixed[0] ^ (0 + unmixed[0])  //Remember prev = 0 initially

因此     mixed [0] = unmixed [0] ^ unmixed [0] = 0

所以混合数组的第一个字节总是0。

mix函数不会增加或减少数组的大小,因此我们最终得到一个len字节数组,第一个元素为0。

因此我们有效地将len字节数组的空间映射到len-1字节数组。

如果这是完全可逆的,我们将能够将n字节数组压缩为n-1字节数组,然后将该n-1字节数组压缩为n-2字节数组,依此类推。

如果我们使用单字节数组作为示例,那么我们看到mix只生成一个单元素为0的数组,你怎么知道它之前的256个可能的未混合数组中的哪一个?