【问题标题】:Hex encoded form of byte array different to same byte array “object” converted to byte array. Why?字节数组的十六进制编码形式与转换为字节数组的相同字节数组“对象”不同。为什么?
【发布时间】:2011-03-31 16:51:57
【问题描述】:

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

使用 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

【问题讨论】:

    标签: java bytearray apache-commons-codec


    【解决方案1】:

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

    【讨论】:

    • 谢谢 - 我仍然不能正确理解这一点(但这不是你的错!)。在我看来,使用 ObjectOutputStream 不适合这种情况。也许 DataOutputStream 会给我一些更接近我预期的结果 - 尽管它已经是一个字节数组,因此不需要进一步处理。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-07
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多