在Java中对Shift-JIS字符使用XOR

时间:2011-05-22 22:47:55

标签: java xor shift-jis

所以我正在尝试编写一个小解密程序但是我遇到了一些麻烦。 我正在使用'FF'(反转所有位)对字符应用XOR,我通过将字符串转换为字节数组然后对其应用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” 当我做“你好那里”的事情时,我会得到“。#**”f2。#4#“

1 个答案:

答案 0 :(得分:3)

你根本不能对多字节字符进行这种字节操作。

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

来自维基百科的文章Shift JIS

  

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

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

如果你想反转这些位并再次在内部使用byte[]数据类型,只有当你确定它是一个Shift JIS结构化字节数组时,才将它转回一个字符串。