Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中对Shift-JIS字符使用异或_Java_Xor_Shift Jis - Fatal编程技术网

在Java中对Shift-JIS字符使用异或

在Java中对Shift-JIS字符使用异或,java,xor,shift-jis,Java,Xor,Shift Jis,所以我试图写一个小解密程序,但我遇到了一点麻烦。 我将XOR应用于带有“FF”(反转所有位)的字符,通过将字符串转换为字节数组,然后对其应用XOR来实现。但是这些字符是用Shift-JIS编码的,有些东西不起作用。 当我尝试使用普通字母的方法时,它似乎有效,但当它使用日语字符时,就会出现问题 public void sampleMethod(String a) { try { String b = "FF"; byte[] c = a.get

所以我试图写一个小解密程序,但我遇到了一点麻烦。 我将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)
       {
        }

    }
public void sampleMethod(字符串a)
{
试一试{
字符串b=“FF”;
字节[]c=a.getBytes(“Shift_JIS”);
byte[]d=b.getBytes(“Shift_JIS”);
字节[]e=新字节[50];

对于(inti=0;i您根本无法对多字节字符执行这种字节操作

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

从维基百科的文章中

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

我可以想象,通过异或,你违反了这个保证


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

是的,这基本上适用于任何多字节编码。它还包括任何类型的Unicode,所以甚至不要试图通过将其转换为不同的编码来绕开它。虽然我不确定这应该是什么omplish无论如何-似乎完全是任意的。我基本上只想反转位,从001110010到110001101,然后将其转换回字符。这可能吗?是的,应该可以反转位并返回,但请确保在内部使用字节数组,并且只有当它确实是字符串时才将其转换回字符串shift jis string.No.一个简单的例子:Atm(我希望至少如此)Unicode代码平面的定义上限为0x10FFFF-因此,如果您在该标记上方使用任何反转符号,则该符号将无效。然后,我们不讨论不同代码点之间的间隙,这些代码点仅在与其他CP组合时才起作用(我认为这样的事情确实存在,如果我错了请纠正我)。因此,基本上整个企业从一开始就注定要失败。@Jeff Foster我解释说,他确实希望将反转的字节打印为字符。显然,如果对同一模式进行两次异或,则可以恢复输入,但这真的有什么用?