我正在尝试用十六进制编码一个字符串,然后再将它转换为字符串。为此我正在使用apache通用编解码器。特别是我已经定义了以下方法:
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
public String toHex(byte[] byteArray){
return Hex.encodeHexString(byteArray);
}
public byte[] fromHex(String hexString){
byte[] array = null;
try {
array = Hex.decodeHex(hexString.toCharArray());
} catch (DecoderException ex) {
Logger.getLogger(SecureHash.class.getName()).log(Level.SEVERE, null, ex);
}
return array;
}
奇怪的是,转换回来时我没有获得相同的初始字符串。更奇怪的是,我得到的字节数组,它与字符串的初始字节数组不同。 我写的小测试程序如下:
String uno = "uno";
byte[] uno_bytes = uno.getBytes();
System.out.println(uno);
System.out.println(uno_bytes);
toHex(uno_bytes);
System.out.println(hexed);
byte [] arr = fromHex(hexed);
System.out.println(arr.toString());
输出示例如下:
uno #initial string
[B@1afe17b #byte array of the initial string
756e6f #string representation of the hex
[B@34d46a #byte array of the recovered string
还有另一种奇怪的行为。字节数组([B @ 1afe17b]不是固定的,但与运行代码不同,但我不明白为什么。
答案 0 :(得分:1)
打印字节数组时,toString()
表示不包含数组的内容。相反,它包含一个类型指示符([B
表示字节数组)和哈希码。对于两个不同的字节数组,哈希码将是不同的,即使它们包含相同的内容。有关详细信息,请参阅Object.toString()
和Object.hashCode()
。
相反,您可能希望使用以下方法比较数组:
System.out.println("Arrays equal: " + Arrays.equals(uno_bytes, arr));