Чтение файла с бинарными данными в текстовом виде

281
02 марта 2017, 23:16

Добрый день. У меня есть файл, который я храню в ресурсах приложения, а именно в raw. В данном файле размещены массив байт, как я понимаю, он в текстовом формате. Мне нужно считать его и преобразовать в массив байт.

Вот так выглядит файл:

...

:200020000000000000000000000000001F020008210200080000000023020008714A00087C :2000400027020008290200082B0200082D0200082F020008310200083302000835020008E0 :2000600037020008390200083B0200083D0200083F02000841020008430200084502000840

...

Я открываю файл и записываю его содержимое в массив my_array, однако при выведении содержимого массива в логи, конечно же отображается далеко не желаемый результат. Что-то мне подсказывает, что проблемы где-то на этом этапе :) Как я понимаю, перед записыванием элемента из файла в массив байт, его нужно преобразовывать (так ли это???). Вообщем, подскажите пожалуйста что я делаю не так и как сделать правильно.

String filename = "file_name";
    int id = getResources().getIdentifier(filename, "raw", getPackageName());
    byte[] my_array;
try {
       my_array  = getText(id, context);
     } catch (IOException e) {e.printStackTrace();}

Метод getText:

public byte[] getText(int id, Context context) throws IOException {
        Resources resources = context.getResources();
        InputStream is = resources.openRawResource(id);
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] readBuffer = new byte[2 * 1024 * 1024];
        try {
            int read;
            do {
                read = is.read(readBuffer, 0, readBuffer.length);
                if(read == -1) {
                    break;
                }
                bout.write(readBuffer, 0, read);
            } while(true);
            return bout.toByteArray();
        } finally {
            is.close();
        }
    }
Answer 1

Ваш код интепретирует текст как символы (char) и записывает их бинарное представление в ByteArrayOutputStream. Если исходный файл содержит текст в HEX формате, то следует конвертировать этот hex в байты.

byte[] hexToBinary(String str){
    byte[] data = new byte[str.length()/2];
    for(int i=0; i < data.length; i++){
        data[i] = (byte) ((Character.digit(str.charAt(2*i), 16) << 4)
                + Character.digit(str.charAt(2*i+1), 16));
    }
    return data;
}

В эту функцию передать строку из байтов полученных из is.read(readBuffer, 0, readBuffer.length); и уже результат записать в ByteArrayOutputStream.

do {
     read = is.read(readBuffer, 0, readBuffer.length);
     if(read == -1) {
        break;
     }
     String hex = new String(readBuffer);
     byte[] data = hexToBinary(hex);
     bout.write(data);
   } while(true);
READ ALSO
Экранирование полей JSON

Экранирование полей JSON

Есть JSON со сложной структурой, у которого в значении поля есть символ кавычек или другой спецсимвол

441
вопрос по android разработке [требует правки]

вопрос по android разработке [требует правки]

Пишу android приложение по замене фона фотоВ нем должен быть магазин фонов, которые можно загрузить с сервера

242
Ошибка сокета при изменении сети

Ошибка сокета при изменении сети

После переключения сети (например, с Wifi на мобильную сеть), сокет выдает ошибку

226
При запросе данные не извлекаются

При запросе данные не извлекаются

При запросе данные не извлекаютсяЕсли условие не срабатывает-все работает и извлекаются все записи с помощью только даты

206