十六进制编码形式的字节数组不同于相同的字节数组“对象”转换为字节数组。为什么?

时间:2011-03-30 11:44:43

标签: java bytearray apache-commons-codec

这个问题是出于好奇而不是迫切需要而被问到的。我发现了一些将对象转换为字节数组的代码(我以为我当时需要它)。

使用commons-codec我注意到纯字节数组的编码Hex字符串表示与我通过" toByteArray"传递字节数组时得到的不同。方法如下。我注意到较长的版本以Hex字符串表示的较短版本结束。

本能地这似乎不对,为什么会发生这种情况?

通过" 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;
    }
}

RESULT

  

537461636b6f766572666c6f77   aced0005757200025b42acf317f8060854e002000078700000000d537461636b6f766572666c6f77

2 个答案:

答案 0 :(得分:7)

第二种编码要长得多,因为它是一种对象序列化格式,而第一种情况只是内容。对象序列化有标题,对象的类型,最后是对象中的内容(你会注意到结尾是相同的)

答案 1 :(得分:2)

ObjectOutputStream能够序列化任何类型的对象(只要它是Serializable)。因此,它无法将任何byte[]映射到自身,因为这意味着没有其他对象的空间。