十六进制编码的字节数组形式,与同一字节数组“对象”转换为字节数组。为什么?
-
14-11-2019 - |
题
这个问题被问到好奇心而不是任何迫切需要。我找到了一些代码来将对象转换为字节数组(我认为当时需要它)。
使用commons-codec我注意到,如果我通过下面的“tobytearray”方法通过字节数组,则纯字节数组的编码的十六进制字符串表示与我的编码十六进制字符串表示不同。我注意到,较长的版本以较短版本的十六进制字符串表示来结束。
本能似乎不是对的,为什么会发生这种情况?
通过“tobytearray”转换方法的额外字节是什么代表?
我猜它与编码有关吗?
非常感谢,我希望这不是一个新手问题。
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 aced0005757200025b42acf317f8060854e002000078700000000d537461636b6f766572666c6f77
解决方案
第二个编码要长得多,因为它是一个对象序列化格式,而第一种情况只是内容。对象序列化具有标题,对象的类型,最后对象中的内容(您将注意到结束是相同的)
其他提示
objectOutputStream能够序列化任何类型的对象(只要它是序列化的)。所以,它不能真正将任何生成的世代划线映射到自己,因为这意味着其他对象没有空间。
不隶属于 StackOverflow