我有一个字节数组,并使用new String(array)
从中创建字符串。当我使用.getBytes()
将其转换回字节数组时,它不会返回原始字节数组。是什么赋予了?
String text = "two hats";
boolean t1 = Arrays.equals(text.getBytes(), text); // true
byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};
String test1 = new String(barray);
boolean t2 = Arrays.equals(barray.getBytes(), test1); // false
// I tried setting an encoding but that didn't help.
Charset cs = Charset.forName("UTF-8");
String test2 = new String(barray, cs);
boolean t3 = Arrays.equals(barray, test2, cs); // false
这是我实际使用的代码。
// test byte array vs string
public static void testEqual(byte[] bytes, String str) {
byte[] fromString = str.getBytes();
printBytes(bytes);
printBytes(fromString);
System.out.println(Arrays.equals(bytes, fromString));
}
// test byte array vs string, with charset
public static void testEqual(byte[] bytes, String str, Charset charset) {
byte[] fromString = str.getBytes(charset);
printBytes(bytes);
printBytes(fromString);
System.out.println(Arrays.equals(bytes, fromString));
}
// prints bytes as hex string
public static void printBytes(byte[] bytes) {
for (byte b: bytes) {
System.out.print(String.format("%02X ", b));
}
System.out.println();
}
public static void main(String[] args) {
String text = "two hats";
testEqual(text.getBytes(), text); // works fine
byte[] barray = {(byte)0x8f, (byte)0xd5, (byte)0xaf, (byte)0x30, (byte)0xb9};
String test1 = new String(barray); // breaks
testEqual(barray, test1);
Charset cs = Charset.forName("UTF-8"); // breaks too
String test2 = new String(barray, cs);
testEqual(barray, test2, cs);
}
PS:我不想使用Base64或某些
答案 0 :(得分:4)
您似乎试图通过使用平台默认编码将任意二进制数据转换为字符串来存储任意二进制数据。不要那样做。使用base64或hex将任意二进制数据表示为文本。 base64转换有很多类;我喜欢this public domain one。
如果数据确实是 某种文本的二进制编码形式,则应明确指定编码 - 但如果原始数据是文本,则仅是适当的。 (使用平台默认编码几乎总是一个坏主意。)
二进制数据和文本数据非常不同。将不透明的二进制数据任意转换为字符串就像是希望能够将任意文件加载到图像编辑器中并看到有用的东西。