2011-03-30 50 views
3

這個問題是出於好奇而不是任何迫切的需求。我發現了一些代碼將一個對象轉換爲一個字節數組(我認爲我當時需要它)。十六進制編碼形式的字節數組不同於相同的字節數組「對象」轉換爲字節數組。爲什麼?

使用公共編解碼器,我注意到,純字節數組的編碼的十六進制字符串表示是我得到了什麼,如果我穿過下面的「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

回答

7

第二編碼要長得多,因爲它是一個對象序列化格式,而第一種情況是僅有的內容。對象序列化具有頭部,對象的類型以及對象的內容(您會注意到對象的內容相同)

+0

謝謝 - 我仍然不正確地理解這一點(但是這不是你的錯!)。它在我看來像使用ObjectOutputStream不適合這種情況。也許DataOutputStream會給我更接近我預期的結果 - 雖然它已經是一個字節數組,因此不需要進一步處理。 – 2011-03-30 14:59:04

+0

如果DataOutputStream已經是一個字節[],則它不執行任何操作。 – 2011-03-30 15:03:25

2

ObjectOutputStream能夠序列化任何類型的對象(只要它是可序列化的)。所以,它不能真的映射任何byte[]自己,因爲這意味着沒有其他對象的空間。

相關問題