自然可以使用两次异或来取回原始值。如果原始值是掩码的一部分怎么办?
编码:
e[i] = c[i] ^ (c[i] + c[i-1])
假设:起始值 c[-1] = 0,^ 表示按位异或
在命令式 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 => 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))。所以是的,在集合中必须丢失一个字节。