簡體   English   中英

將byte []與二進制數據一起轉換為String

[英]Convert byte[] with binary data to String

我有二進制格式的數據( hex: 80 3b c8 87 0a 89 ),我需要將其轉換為字符串,以便通過Jackcess在MS Access數據庫中保存二進制數據。 我知道,我不認為在Java中使用String來獲取二進制數據,但Access db是第三方產品,我無法控制。

所以我試圖轉換二進制數據並保存它,但不幸的是結果出乎意料。

byte[] byteArray = new byte[] {0x80, 0x3b, 0xc8, 0x87, 0x0a 0x89};
System.out.println(String.format("%02X ",byteArray[0])+String.format("%02X ", byteArray[1]));//gives me the same values

String value = new String(byteArray, "UTF-8");//or any other encoding
System.out.println(value);//completely different values

我想知道在new String下發生了什么,以及是否有辦法將二進制數據轉換為String並具有相同的十六進制值。

注1 :最初我讀了一個與hex無關的二進制文件。 我只使用hex來比較數據集。

注2有人建議使用Base64 aka MIME,UTF-7等。根據我的理解,它采用二進制數據並將其編碼為ANSI字符集,基本上調整初始數據。 但是,對我來說這不是一個解決方案,因為我必須寫出我在二進制數組中保存的確切數據。

byte[] byteArray = new byte[]{0x2f, 0x7a, 0x2d, 0x28};
byte[]   bytesEncoded = Base64.encodeBase64(byteArray);
System.out.println("encoded value is " + new String(bytesEncoded ));//new data

為了安全地將任意二進制數據轉換為文本,您應該使用hex或base64之類的東西。 諸如UTF-8之類的編碼意味着將任意文本數據編碼為字節,而不是將任意二進制數據編碼為文本。 這與源數據有什么不同。

我強烈建議使用庫。 例如,與番石榴

String hex = BaseEncoding.base16().encode(byteArray);
// Store hex in the database in the text field...
...
// Get hex from the database from the text field...
byte[] binary = BaseEncoding.base16().decode(hex);

(其他庫當然可用,例如Apache Commons Codec。)

或者,將二進制數據保存到Access中的字段中,該字段為二進制數據而設計 ,而不是將其轉換為文本。

要采取的基本教訓 - 永遠不要將二進制數據與String等價物混淆。

我的錯誤是,我將初始數據從Access導出到csv,同時將索引字段的類型從二進制更改為字符串(完全混亂,現在我知道)。 我來的解決方案 - 我自己的Access導出工具,所有數據都保存為二進制。 感謝@ gord-thompson - 他的評論導致了解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM