Как редактировать бинарный файл в Android? - PullRequest
1 голос
/ 06 июня 2019

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

Этот файл, который я хочу открыть, имеет несколько параметров, записанных в 2 байта. например 00 06 00 50 01 AB = 6, 80, 427 Пока мне удалось открыть файл bin, поместить все данные из файла в byte[].

Вот код для открытия и чтения файла:

String path = getFilesDir().getAbsolutePath();
File file = new File(path + "/file.bin");
int size = (int) file.length();
byte[] bytes = new byte[size];

FileInputStream fis = new FileInputStream(file);
try {
    fis.read(bytes);
    ...
} finally {
    fis.close();
}

Вот первая попытка преобразовать byte[] в значения deciaml:

for (int i = 0; i < size / 2; i = i + 2) {
    intArray[i] = ((bytes[i] & 0xff) << 8) | (bytes[i + 1] & 0xff);
}

Но в этом коде только каждое второе значение является правильным. Это показывает 6,0,80,0,1 и должно быть 6,80,1.

Вторая идея состояла в том, чтобы преобразовать byte[] в String[], а затем в, например, int[] но это не работает, как задумано. В этом фрагменте я не анализировал весь массив, а только hexArray[4], который был 50 в шестнадцатеричном и 80 в декабре, но результат был 50.

for (int i = 0; i < size; i = i + 2) {
    num1 = String.format("%02X", bytes[i] & 0xFF);
    num2 = String.format("%02X", bytes[i + 1] & 0xFF);

    String twoByte = num1 + num2;
    hexArrayWithNull[i] = twoByte;
}
String[] hexArray = Arrays.stream(hexArrayWithNull).filter(Objects::nonNull).toArray(String[]::new);
num = String.format("%d", Integer.parseInt(hexArray[4]));

Я застрял здесь и мне нужно руководство. Я должен также сказать, что я новичок в программировании. Спасибо

1 Ответ

0 голосов
/ 06 июня 2019

Вы увеличиваете i в каждой итерации на 2 и сохраняете в intArray[i]. Итак, вы сохраняете в index [0], затем index [2], затем index [4] и так далее. Это объясняет нули при нечетных индексах [1], [3], ...

Кроме того, вы должны продолжать цикл до size, а не size/2.

Вот правильный цикл:

for (int i = 0; i < size; i = i + 2) {
    intArray[i/2] = ((bytes[i] & 0xff) << 8) | (bytes[i + 1] & 0xff);
}

Вот еще одна возможность:

for (int i = 0; i < size/2; i = i + 1) {
    intArray[i] = ((bytes[2*i] & 0xff) << 8) | (bytes[2*i + 1] & 0xff);
}

[EDIT]

Обратной операцией будет:

for (int i = 0; i < size/2; i = i + 1) {
    bytes[2*i] = (intArray[i] & 0xff00) / 256; //or >>8 instead of /256
    bytes[2*i+1] = intArray[i] & 0xff;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...