Заменить все внутри набора битов с набором битов другого размера - PullRequest
0 голосов
/ 19 октября 2018

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

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете определить функцию setBitsFromIndex(int i, BitSet source, BitSet dest):

private static void setBitsFromIndex(int i, BitSet source, BitSet dest) {
    for (int j = 0; j < source.length(); j++) {
        dest.set(i+j, source.get(j));
    }
}

Затем в своем коде:

for (int i = 0; i < bitSet.length() - bitString.length(); i++) { 
    if (bitSet.get(i, i + bitString.length()).equals(bitString)) {

        //Replace bitset with a different bit set

        BitSet tempBitSet = bitSet.get(i + bitString.length(), bitSet.length());
        setBitsFromIndex(i, bitReplace, bitSet);
        setBitsFromIndex(i + bitReplace.length(), tempBitSet, bitSet);

        // if bitReplace is shorter than bitString, we may need to clear trailing bits
        if (bitReplace.length() < bitString.length()) {
            bitSet.clear(i + bitReplace.length() + tempBitSet.length(), bitSet.length());
        }
        break;
    }
}

BE WARNED: Длина BitSetНЕ это емкость, или даже длина, которая была до последнего раза, когда вы установили немного.Это индекс + 1 HIGHEST SET (1) BIT , поэтому ваши битовые наборы bitReplace, bitString и bitSet могут быть не той длины, о которой вы думаете, если они имеют 0 всамые значимые биты.Если вы хотите включить начальные нули, вы должны независимо отслеживать желаемый размер ваших bitReplace и bitString битсетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...