所以我正在尝试编写一个小解密程序但是我遇到了一些麻烦。 我正在使用'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#“
答案 0 :(得分:3)
你根本不能对多字节字符进行这种字节操作。
日语字符(和其他扩展字符)通常由一系列字节表示。改变这些可能会产生无法正确解码的无效序列(我猜这是你所看到的结果)。
来自维基百科的文章Shift JIS
只保证第一个字节为高位设置(0x80-0xFF);第二个字节的值可以是高或低
我想通过XOR'ing你打破了这个保证。
如果你想反转这些位并再次在内部使用byte[]
数据类型,只有当你确定它是一个Shift JIS结构化字节数组时,才将它转回一个字符串。