Arhn - архитектура программирования

Строка из 0 и 1 для файла в виде битов

Я работаю над java-приложением Хаффмана, и я почти закончил. У меня есть одна проблема. Мне нужно сохранить строку типа "101011101010" в файл. Когда я сохраняю его с моим текущим кодом, он сохраняет его как символы, которые занимают 1 байт каждый 0 или 1. Я почти уверен, что можно сохранить каждый 0/1 как бит.

Я уже пробовал кое-что с BitSet и Integer.valueOf, но не могу заставить их работать. Это мой текущий код:

FileOutputStream fos = new FileOutputStream("encoded.bin");
fos.write(encoded.getBytes());
fos.close();

Где «закодировано» — это строка, которая может выглядеть так: «0101011101». Если я попытаюсь сохранить его как целое число, начальный 0 будет удален.

Заранее спасибо!

РЕДАКТИРОВАТЬ: Хаффман — это метод сжатия, поэтому выходной файл должен быть как можно меньше.

24.09.2016

  • Почему вы хотите, чтобы строка была преобразована в целое число? Нельзя ли сохранить строку с начальными 0, когда можно сохранить строку без начальных 0? В чем именно ваша проблема? 25.09.2016
  • Ну, это метод сжатия. Таким образом, один «a» или «b» преобразуется во что-то вроде 0110 (что составляет 4 бита, а не 1 байт). Проблема в том, что я сохраняю 1 и 0 как 1 байт, поэтому сжатия нет (теперь это еще хуже). 25.09.2016

Ответы:


1

Думаю, я нашел свой ответ. Я помещаю 1 и 0 в BitSet, используя следующий код:

BitSet bitSet = new BitSet(encoded.length());
int bitcounter = 0;
for(Character c : encoded.toCharArray()) {
    if(c.equals('1')) {
        bitSet.set(bitcounter);
    }
    bitcounter++;
}

После этого я сохраняю его в файл, используя bitSet.toByteArray(). Когда я хочу прочитать его снова, я конвертирую его обратно в набор битов, используя BitSet.valueOf(bitSet.toByteArray()). Затем я перебираю битовый набор следующим образом:

String binaryString = "";
for(int i = 0; i <= set.length(); i++) {
    if(set.get(i)) {
        binaryString += "1";
    } else {
        binaryString += "0";
    }
}

Спасибо всем, кто помог мне.

25.09.2016

2

Двоичные файлы ограничены хранением битов, кратных восьми. Вы можете решить эту проблему, разбив строку на восьмибитные фрагменты, преобразовав их в байты с помощью Byte.parseByte(eightCharString, 2) и добавив их в массив байтов:

  • Вычислите длину массива байтов, разделив длину вашей битовой строки на восемь
  • Выделить массив байтов нужной длины
  • Запустите цикл, который берет подстроки из строки в позициях, кратных восьми.
  • Разобрать каждый фрагмент и поместить результат в соответствующий байт
  • Вызов fos.write() в массиве байтов
24.09.2016
  • Проанализируйте каждый фрагмент и поместите результат в соответствующий байт, на котором я застрял. Я не могу использовать Integer.parseInt, потому что это удалит начальные 0. Когда я пытаюсь использовать Byte.parseByte(s, 2), он не работает, потому что он не подписан. 24.09.2016
  • @LuudvanKeulen Какое исключение вы получаете? Кстати, если синтаксический анализ int работает нормально, вы можете преобразовать результат int в byte, и он тоже будет работать. 25.09.2016
  • 'java.lang.NumberFormatException: значение вне допустимого диапазона. Значение: 11101101 Основание: 10 'Я прочитал, что это так, потому что он не принимает ничего выше определенного значения, поэтому 1111111 невозможно. 25.09.2016
  • @LuudvanKeulen Передайте 2 для системы счисления, как я предложил в ответе. 25.09.2016
  • Тот же результат. Это потому, что байт может быть только 127 большим, и если у вас есть 8 раз 1, это будет 255. 25.09.2016
  • Затем введите int, он должен работать. Пройдите 2 для основания. 25.09.2016
  • Проблема в том, что int не принимает ведущие 0. Мне нужны эти нули, потому что это часть алгоритма. 25.09.2016

  • 3

    Попробуй это.

    String encoded = "0101011101";
    FileOutputStream fos = new FileOutputStream("encoded.bin");
    String s = encoded + "00000000".substring(encoded.length() % 8);
    for (int i = 0, len = s.length(); i < len; i += 8)
        fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2));
    fos.close();
    
    24.09.2016
  • Если я не ошибаюсь, это даст десятичное значение BinaryString правильно? Это работает, когда я сохраняю его, но когда я пытаюсь его прочитать, он удаляет все начальные нули. Например: я делаю Integer.parseInt("00001111", 2), который возвращает 15. Когда я пытаюсь сделать Integer.toBinaryString(15), он возвращает 1111. 25.09.2016
  • Вы должны сделать как String s = "00000000" + Integer.toBinaryString(15); и String decoded = s.substring(s.length() - 8); 25.09.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..