在Java中对Shift-JIS字符使用异或
所以我试图写一个小解密程序,但我遇到了一点麻烦。 我将XOR应用于带有“FF”(反转所有位)的字符,通过将字符串转换为字节数组,然后对其应用XOR来实现。但是这些字符是用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
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我解释说,他确实希望将反转的字节打印为字符。显然,如果对同一模式进行两次异或,则可以恢复输入,但这真的有什么用?