1

当然、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 バイトの損失があるはずです。

4

1 に答える 1