当然、XOR を 2 回使用して元の値を取得できます。元の値がマスクの一部である場合はどうなりますか?
エンコーディング:
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 => 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 バイトの損失があるはずです。