1

因此,我正在尝试编写一个小解密程序,但遇到了一些麻烦。我将 XOR 应用于带有 'FF' 的字符(反转所有位),我通过将字符串转换为字节数组然后对其应用 XOR 来做到这一点。但是这些字符是 Shift-JIS 编码的,有些东西不起作用。当我尝试使用普通字母的方法时,它似乎有效,但是当它使用日文字符时出现问题。

public void sampleMethod(String a)
    {
       try {
        String b = "FF";
        byte[] c = a.getBytes("Shift_JIS");
        byte[] d = b.getBytes("Shift_JIS");
        byte[] e = new byte[50];
        for (int i=0; i<c.length; i++)
        {
            e[i] =(byte)(c[i]^d[i%2]);
        }
        String t = new String(e, "Shift_JIS");
        System.out.println(t);
    }
       catch (UnsupportedEncodingException e)
       {
        }

    }

但是当我坚持使用日文字符时,它会将它们中的每一个都转换为“yyyyyy”。我尝试打印出字节数组以查看问题,它表明每个字符都存储为“63”。如何正确存储字符?实际上,我将如何在 Shift-JIS 字符上使用 XOR?

我使用 XOR 是因为我基本上只想将位从 0010 反转为 1101,然后将其改回字符。那可能吗?

谢谢

例如,这是我的输入:“始めまして”,我得到的是:“yyyyy”当我执行“hello there”之类的操作时,我得到“.#**)f2.#4#”

4

1 回答 1

3

您根本无法对多字节字符进行这种逐字节操作。

日文字符(和其他扩展字符)通常由一系列字节表示。更改这些可能会产生无法正确解码的无效序列(我猜这就是您所看到的结果)。

来自维基百科的文章,Shift JIS

仅保证第一个字节为高位设置(0x80–0xFF);第二个字节的值可以是高或低

我想通过 XOR'ing 你打破了这个保证。

如果您想反转位并再次返回,请在byte[]内部使用数据类型,并且只有在您确定它是 Shift JIS 结构化字节数组时才将其转回字符串。

于 2011-05-22T22:55:05.163 回答