3

この質問は、緊急の必要性ではなく、好奇心から尋ねられます。オブジェクトをバイト配列に変換するコードを見つけました (当時は必要だと思っていました)。

commons-codec を使用して、純粋なバイト配列のエンコードされた 16 進文字列表現が、以下の「toByteArray」メソッドを介してバイト配列を渡した場合に得られるものと異なることに気付きました。長いバージョンが 16 進文字列表現の短いバージョンで終わっていることに気付きました。

本能的にこれは正しくないように思えますが、なぜこれが起こるのでしょうか?

変換の「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

4

2 に答える 2

7

2 番目のエンコーディングはオブジェクトのシリアル化形式であるため、はるかに長くなりますが、最初のケースはコンテンツだけです。オブジェクトのシリアル化には、ヘッダー、オブジェクトのタイプ、そして最後にオブジェクトのコンテンツがあります (最後が同じであることがわかります)。

于 2011-03-30T11:49:07.000 に答える
2

ObjectOutputStream は、任意の型のオブジェクトをシリアル化できます (シリアル化可能である限り)。byte[]そのため、他のオブジェクトのための余地がないことを意味するため、それ自体にマップすることはできません。

于 2011-03-30T11:51:14.103 に答える