Java 字节数组的十六进制编码形式与同一字节数组不同“;对象”;转换为字节数组。为什么?
问这个问题是出于好奇,而不是出于任何迫切需要。我找到了一些将对象转换为字节数组的代码(当时我想我需要它) 使用commons编解码器,我注意到纯字节数组的编码十六进制字符串表示与通过下面的“toByteArray”方法传递字节数组时得到的不同。我注意到较长的版本以较短的十六进制字符串表示形式结束 出于本能,这似乎不正确,为什么会发生这种情况 通过“toByteArray”转换方法找到的额外字节代表什么 我猜这和编码有关吧 非常感谢,我希望这不是一个太多的新手问题Java 字节数组的十六进制编码形式与同一字节数组不同“;对象”;转换为字节数组。为什么?,java,bytearray,apache-commons-codec,Java,Bytearray,Apache Commons Codec,问这个问题是出于好奇,而不是出于任何迫切需要。我找到了一些将对象转换为字节数组的代码(当时我想我需要它) 使用commons编解码器,我注意到纯字节数组的编码十六进制字符串表示与通过下面的“toByteArray”方法传递字节数组时得到的不同。我注意到较长的版本以较短的十六进制字符串表示形式结束 出于本能,这似乎不正确,为什么会发生这种情况 通过“toByteArray”转换方法找到的额外字节代表什么 我猜这和编码有关吧 非常感谢,我希望这不是一个太多的新手问题 import java.io.B
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import org.apache.commons.codec.binary.Hex;
public class Test {
public static void main(String[] args) throws IOException {
byte[] bytes = "Stackoverflow".getBytes();
System.out.println(Hex.encodeHexString(bytes));
System.out.println(Hex.encodeHexString(toByteArray(bytes)));
}
public static byte[] toByteArray(Object obj) throws IOException {
byte[] bytes = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
oos.close();
bos.close();
bytes = bos.toByteArray();
return bytes;
}
}
结果
537461636b6f766572666c6f77
ACED0057200025B42ACF317F8060854E0020000787000000D537461636B6F766572666C6F77
第二种编码更长,因为它是一种对象序列化格式,而第一种情况只是内容。对象序列化具有头、对象类型以及对象中的最终内容(您会注意到结尾是相同的)ObjectOutputStream可以序列化任何类型的对象(只要它是可序列化的)。因此,它无法真正将任何
字节[]
映射到自身,因为这意味着没有空间容纳其他对象。谢谢-我仍然不能正确理解这一点(但这不是你的错!)。在我看来,使用ObjectOutputStream不适合这种情况。也许DataOutputStream会给我一些更接近我预期的结果——尽管它已经是一个字节数组,所以不需要进一步处理。