2015-05-27 231 views
0

我有一個字節數組byteObj它由BSON序列化。與string.getBytes混淆()

String strObj = new String(byteObj) 
System.out.println(byteObj.length) 
System.out.println(strObj.getBytes().length) 

結果是152154。而這兩個字節數組並不相同。如何從字符串中恢復原始的bson字節數組?

更新:

152 154 
[-104, 0, 0, 0, 4, 116, 105, 116, 108, 101, 0, 80, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 3, 0, 0, 0, 105, 115, 0, 2, 50, 0, 2, 0, 0, 0, 97, 0, 2, 51, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 52, 0, 2, 0, 0, 0, 97, 0, 2, 53, 0, 3, 0, 0, 0, 105, 115, 0, 2, 54, 0, 6, 0, 0, 0, 116, 105, 116, 108, 101, 0, 0, 4, 99, 111, 110, 116, 101, 110, 116, 0, 51, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 2, 0, 0, 0, 97, 0, 2, 50, 0, 8, 0, 0, 0, 99, 111, 110, 116, 101, 110, 116, 0, 2, 51, 0, 3, 0, 0, 0, 105, 115, 0, 0, 0] 
[-17, -65, -67, 0, 0, 0, 4, 116, 105, 116, 108, 101, 0, 80, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 3, 0, 0, 0, 105, 115, 0, 2, 50, 0, 2, 0, 0, 0, 97, 0, 2, 51, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 52, 0, 2, 0, 0, 0, 97, 0, 2, 53, 0, 3, 0, 0, 0, 105, 115, 0, 2, 54, 0, 6, 0, 0, 0, 116, 105, 116, 108, 101, 0, 0, 4, 99, 111, 110, 116, 101, 110, 116, 0, 51, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 2, 0, 0, 0, 97, 0, 2, 50, 0, 8, 0, 0, 0, 99, 111, 110, 116, 101, 110, 116, 0, 2, 51, 0, 3, 0, 0, 0, 105, 115, 0, 0, 0] 

首先是BSON字節數組。

更新2: 測試代碼

BSONObject ob = new BasicBSONObject() 
      .append("title", Arrays.asList(new String[]{"this", "is", "a", "this", "a", "is", "title"})) 
      .append("content", Arrays.asList(new String[]{"this", "a", "content", "is"})); 


    byte[] ahaha = BSON.encode(ob); 
    BSON.decode(ahaha); 

    // BSON.decode(new String(ahaha).getBytes()); 

    byte[] strByte = new String(ahaha).getBytes(); 

    System.out.println(ahaha.length + "\t" + strByte.length); 
    System.out.println(Arrays.toString(ahaha)); 
    System.out.println(Arrays.toString(strByte)); 

二進制數據轉換爲字符串,並且反之亦然的溶液見How do you convert binary data to Strings and back in Java?

+0

你原來byteObj陣列應該是長度154 ... – assylias

+0

你確定你Byte數組是文本?我的意思是,也許字節數組是一個圖像,字節不能轉換爲字符串中的有效字符:這就是爲什麼你有一個長度的差異。 – romfret

+0

任何此投票的理由?你甚至可以理解這個問題嗎? – Tilney

回答

1

區別的原因是將字節轉換爲字符串。請注意,第一個字節是負數。這裏是從Javadoc的解釋:

新字符串的長度是字符集的函數,因此可能不等於字節數組的長度。 未指定給定字節在默認字符集中無效時此構造函數的行爲。

當需要對解碼過程進行更多的控制時,應該使用CharsetDecoder類。

+0

字符串的長度不是問題。他輸出'strObj.getBytes()。length',這意味着字節的長度,而不是字符的數量。他期望(也是我)的結果應該與構造'String'的字節數組的長度相同。如果未指定,則默認字符集用於兩次轉換。 – chris

+0

如果我在文檔中讀到類似這樣的內容,我就不會期待任何事情:當該字符串不能在默認字符集中編碼時,此方法的行爲是未指定的。 –

+0

我不認爲序列化表單和字符集之間有任何連接,所以這個CharsetDecoder不能保證字節數組的一致性。 – Tilney

0

我無法重現該問題。下面的代碼返回相同的長度(152)和字節是相同的:

byte[] bs = {-104, 0, 0, 0, 4, 116, 105, 116, 108, 101, 0, 80, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 3, 0, 0, 0, 105, 115, 0, 2, 50, 0, 2, 0, 0, 0, 97, 0, 2, 51, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 52, 0, 2, 0, 0, 0, 97, 0, 2, 53, 0, 3, 0, 0, 0, 105, 115, 0, 2, 54, 0, 6, 0, 0, 0, 116, 105, 116, 108, 101, 0, 0, 4, 99, 111, 110, 116, 101, 110, 116, 0, 51, 0, 0, 0, 2, 48, 0, 5, 0, 0, 0, 116, 104, 105, 115, 0, 2, 49, 0, 2, 0, 0, 0, 97, 0, 2, 50, 0, 8, 0, 0, 0, 99, 111, 110, 116, 101, 110, 116, 0, 2, 51, 0, 3, 0, 0, 0, 105, 115, 0, 0, 0}; 

System.out.println(new String(bs).getBytes().length); 
System.out.println(bs.length); 
+0

我更新了代碼。你可能需要mongo db java驅動來使它工作。 – Tilney

+0

我只是複製/粘貼你的新代碼。結果對我來說是正確的! '152 \t 152' '[-104,0,...]'' [-104,0,...]' 我用BSON版本2.3 – romfret

+0

你能告訴我你的工作空間環境?我在Ubuntu 12上用mongo db driver 3.0.1。 – Tilney