2011-06-17 84 views
2

參考該交Why are the lengths different when converting a byte array to a String and then back to a byte array?變化格式的字節數組轉換時以字符串

我明白,改變由這樣

String s = new String(bytes); 

包含二進制數據的字節數組可能會導致二進制數據的格式因爲它使用默認編碼創建了一個字符串,可以將某些二進制字符轉換爲未知字符,如「?」如果你將它轉換回字節數組,它將是錯誤的。

目前我有一個ByteArrayInputStream一個啞劇由於啞劇啞劇,看起來像這樣

--boundary 
//content type, id, etc... 
//empty line 
//Binary Data 
--boundary-- 

如何從InputStream提取二進制數據,並將其轉換爲Base64如果我不能字節數組轉換爲一個字符串在第一個地方?我正在考慮使用邊界來分割從Bytearrayinputstream轉換來的Sting,但這樣做會在Binary數據編碼到Base64之前搞亂Binary數據。

回答

1

你知道你必須在字節(假設0×13或0×10字節值)中的「空行」,所以才尋求字節,可以劃分原始字節數組。第一部分可以簡單地映射到字符串,對於二進制數據,您現在可以獲得偏移量,長度和字節數據,這就是您所需要的。

+0

感謝alphazero,那是讓我思考的最佳建議!我按字節讀取數組,並在它碰到LF + CR時將其轉換爲字符串。當它作爲一個字節數組轉換時它是一個空字符串,我將所有字節複製到另一個數組中,並在它碰到邊界時停止。然後由於後面增加了兩個LF + CR,我截斷了邊界長度爲+4的字節陣列。如果得出結論:如果在文件中混合使用二進制數據和文本,如果要保持二進制完整性,操縱它的唯一方法是在字節級別? – Maurice

+0

據我所知。如果混合使用「數據類型」 - 意味着字節模式和類型語義之間的不同映射,例如UTF-8 - 在一個連續的字節塊(內存或文件,差異是什麼)中,您自然需要首先將該超級塊劃分爲一組統一數據語義的小塊。所以,解析你一定。 – alphazero

1

如果您在二進制數據字符串的正確的編碼,您可以放心地將二進制轉換爲字符串!如果你知道你的二進制文件在ISO8859-1中包含一個字符串,只要做

new String(byteArray,"ISO8859-1") 

沒有什麼會丟失。併爲您的信息:base64編碼字符串只包含ASCII字符,這是在UTF-8和所有典型的Windows和ISO-編碼是相同的,所以你不會有任何一方的任何問題。

+0

有一些涉及魔法 - 有消息中的二進制數據。內容不是Base64編碼的。 –

+0

Nontheless,他必須知道他的絃樂...... – Daniel

+0

這就是樂趣的開始的編碼。客戶端不會在HTTP標頭中發送編碼。我有一種感覺,市場上的解析器以某種方式做這件事,但我不知道如何。 –

相關問題