2015-01-30 1 views
1

У меня есть данные в двоичном формате (hex: 80 3b c8 87 0a 89), и мне нужно преобразовать их в String, чтобы сохранить двоичные данные в MS Access db через Jackcess. Я знаю, что я не предполагаю использовать String в Java для двоичных данных, однако Access db является сторонним продуктом, и я не контролирую его вообще.Преобразование байта [] с двоичными данными в String

Поэтому я попытался преобразовать двоичные данные и сохранить их, но, к сожалению, результат был неожиданным.

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 и если существует способ преобразования двоичных данных в строки и имеют те же шестнадцатеричные значения.

Примечание 1: сначала я прочитал двоичный файл, который не имеет ничего общего с шестнадцатеричным. Я использую hex только для сравнения наборов данных.

Примечание 2 Было предложение использовать Base64 аку 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 
+0

Подсказка: что означает 'String.valueOf (byteArray)' return? (Это ничего не полезно) – immibis

+0

Вы пытались «String value = new String (byteArray,« UTF-8 »);' –

+0

@ mr.icetea: Это действительно не сработает. UTF-8 не является шестнадцатеричным ... –

ответ

1

Основной урок, который необходимо предпринять - никогда не смешивайте двоичные данные со строковым эквивалентом.

Моя ошибка заключалась в том, что я экспортировал исходные данные из Access в csv, изменяя тип поля индекса из двоичного в String (полный беспорядок, теперь я знаю). Решение, которое я пришло, - мой собственный инструмент экспорта из Access, где все данные хранятся как двоичные. Благодаря @ gord-thompson - его комментарий привел к решению.

2

Чтобы безопасно преобразования произвольные двоичные данные в текст, вы должны использовать что-то вроде шестнадцатеричной или base64. Кодировки, такие как UTF-8, предназначены для кодирования произвольных данных в виде байтов, а не для кодирования произвольных двоичных данных в виде текста. Это разница в том, что такое исходные данные.

Я бы настоятельно рекомендовал использовать библиотеку для этого. Например, с Guava:

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, которая предназначена для бинарные данные, вместо того, чтобы конвертировать его в текст вообще.

+0

Нет, я не конвертирую данные в шестнадцатеричный. Я использую hex для подтверждения, что у меня одинаковые данные по наборам данных. – Dzidas

+0

@Dzidas: Ну, вы должны * преобразовать данные в hex или base64 или что-то в этом роде. Редактирование ... –

+0

Я знаю, что я предполагаю использовать MIME для таких данных, однако я стараюсь вписаться в сторонний дизайн, и у меня нет возможности его изменить. – Dzidas