В настоящее время я имею дело с двоичным файлом, который позже будет записан в другой двоичный файл.Это очень важно и является причиной, по которой я не решаюсь использовать ArrayLists и другие списки, поскольку они, как правило, не подходят мне, когда я пытаюсь записать его в файл напрямую.
Я извлек байтыэтого двоичного файла и разделить их на биты с помощью BitSet.Я думаю, я понял, как найти набор битов, который я хочу заменить.В настоящее время это выглядит примерно так:
try {
InputStream inputStream = new FileInputStream(filepath);
OutputStream outputStream = new FileOutputStream("output.bin");
byte[] buffer = new byte[4096];
BitSet bitSet = new BitSet(4096 * 8);
BitSet bitString = new BitSet(search.length());
BitSet bitReplace = new BitSet(replace.length());
// Search String to bitset
for (int i = search.length() - 1; i >= 0; i--) {
if (search.charAt(i) == '1') {
bitString.set(search.length() - i - 1);
}
}
// Replace String to bitset
for (int i = replace.length() - 1; i >= 0; i--) {
if (replace.charAt(i) == '1') {
bitReplace.set(replace.length() - i - 1);
}
}
while (inputStream.read(buffer) != -1) {
bitSet = BitSet.valueOf(buffer);
bufferCount++;
// GET 4096 BYTES AT THE SAME TIME
// TURN THEM INTO BITS, WE END UP WITH 4096*8 bits
// COMPARE EVERY SEARCHSIZE BITS
for (int i = 0; i < bitSet.length(); i++) {
if (bitSet.get(i, i + bitString.length()).equals(bitString)) {
//TODO: Replace bitset with a different bit set
}
}
}
inputStream.close();
outputStream.close();
} catch (IOException e) {
System.out.println("IOException");
System.exit(1);
}
Чего мне не хватает, так это как установить существующие наборы битов, как только будет найден шаблон битов с другим набором битов (может иметь другой размер).
Таким образом, чтобы проиллюстрировать:
Найти: 01010 заменить на: 001111
Превратил бы эту последовательность битов:
00 |01010 | 01000000000000010
в:
00 | 001111 | 010000000000000010
Абстрактно я думал о решении, чтобы быть таким:
1. Find the pattern that matches the SEARCHed pattern
2. Replace a bitset with a completely different bitset(this is what I'm struggling with, I was thinking about just appending everything to the end of the file, but that would not be very efficient in terms of read/write
3. Shift the other bits to the left or to the right based on the difference between the sizes of the searched pattern and the pattern we're replacing with.
4. Write into file.