我正在开发一个项目,我需要在java中对字符串进行编码和编码。我的字符串是由波斯字符组成的UTF-8字符串。我只想用静态字符xor每个字节,然后用相同的静态字符再次xor它
我写下面的代码,但它完全错误!我用英文字符检查它是否有效
我怎么能解决这个问题,提前谢谢!
String str = "س";
char key = 'N';
byte bKey = (byte) key;
byte[] b = str.getBytes();
for (int i = 0; i < b.length; i++)
{
b[i] = Byte.valueOf((byte) (b[i] ^ bKey));
}
String str1 = new String(b);
b = str1.getBytes();
for (int i = 0; i < b.length; i++)
{
b[i] = (byte) (b[i] ^ bKey);
}
String str2 = new String(b);
答案 0 :(得分:2)
当您从变异的字节创建str1时,问题就出现了。假设您的默认编码是UTF8,当您说String str1 = new String(b);
时,您在这里说的是UTF8编码中的一些字节,请为我构建一个很好的字符串。但是因为你对字节进行了异或,所以编码是无效的UTF8,Java并不知道如何处理它。如果您查看使用b = str1.getBytes();
从str1检索的字节,您将看到它们与您创建字符串的字节不同!
真的,你不应该从&#34;废话&#34;创建一个字符串。 bytes ---你真的需要将XOR&#39; d字节存回字符串吗?
如果你真的想这样做,你可以使用单字节编码来欺骗系统,其中所有可能的字节值都是有效的。然后你可以确定你输入字符串的字节与你得到的字节相同。这是一个为我工作的例子:
public class B {
static public void main(String[] args) throws Exception {
String str = "س";
System.out.println(str);
char key = 'N';
byte bKey = (byte) key;
byte[] b = str.getBytes("UTF8");
System.out.println("Original bytes from str:");
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
System.out.println("Bytes used to create str1:");
for (int i = 0; i < b.length; i++) {
b[i] = Byte.valueOf((byte) (b[i] ^ bKey));
System.out.println(b[i]);
}
String str1 = new String(b, "Cp1256");
b = str1.getBytes("Cp1256");
System.out.println("Bytes retrieved from str1:");
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
b[i] = (byte) (b[i] ^ bKey);
}
System.out.println("Bytes used to create str2:");
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
String str2 = new String(b, "UTF8");
System.out.println(str2);
}
}
我得到的输出是:
س
Original bytes from str:
-61
-65
-30
-119
-91
Bytes used to create str1:
-115
-15
-84
-57
-21
Bytes retrieved from str1:
-115
-15
-84
-57
-21
Bytes used to create str2:
-61
-65
-30
-119
-91
س
答案 1 :(得分:1)
当您尝试使用XORed字节创建新的String
时会出现问题:
String str1 = new String(b);
b = str1.getBytes();
由于XORed字节不能形成有效的Unicode / UTF-8字符,因此String
无效,getBytes()
不会返回您的认为。
如果您跳过转换回String
,您的代码将正常运行。
答案 2 :(得分:0)
首先,str.getBytes();表示使用默认字符集将字符转换为字节。和String str1 = new String(b);也使用默认字符集。这里没有与UTF-8相关的内容。
在Java中进行位操作有点棘手,尝试将所有b [i]更改为(b [i]&amp; 0xff)。