Чтение и сжатие Хаффманом 4-байтовой двоичной строки STD C ++ Linux Environment - PullRequest
0 голосов
/ 29 мая 2011

Я работаю над домашней работой по кодированию Хаффмана.У меня уже есть алгоритм Хаффмана, но мне нужно немного изменить его для работы с двоичными файлами.Я потратил некоторое время на чтение связанных проблем, и, возможно, из-за моего непонимания типов данных и двоичных файлов, я все еще немного борюсь, так что, надеюсь, я не буду повторять предыдущий вопрос (я не буду публиковать код, связанный счасть программы).

Вот ключевая фраза: «Можно предположить, что каждый символ, который будет отображаться в кодовом слове, является 4-байтовой двоичной строкой». И я думаю, что я знаю, что Char представляет один байт.и unsigned int представляет четыре байта, поэтому я предполагаю, что я должен читать входные четыре байта за раз в неподписанный int Buffer, а затем собирать данные для части программы Хаффмана.

int main() {
    unsigned int buffer;
    fstream input;
    input.open("test.txt", ios::in | ios::binary);


    while(input) {
        input.read(reinterpret_cast<char *>(&buffer), 4);
        //if buffer does not exist as unique symbol in collection of data add it
        //if buffer exists update statistics of symbol
    }
    input.close();
}

это похоже на хороший способ обработки данных?Как мне обработать самый конец файла, если осталось только 1,2 или 3 байта?Итак, я просто храню буфер как unsigned int в структуре.Просто из любопытства, как мне преобразовать буфер в строку символов?
Редактировать: Какой лучший способ сохранить заголовок сжатого файла Хаффмана?

1 Ответ

1 голос
/ 29 мая 2011

Похоже ли это на хороший способ обработки данных?

Вместо наведения указателя я бы предложил использовать union из int и char [4] и передатьуказатель на массив char, как и должно быть.Не знаю, какова остальная часть логики, поэтому не могу сказать, если фактическая обработка (которой нет в коде, который вы опубликовали) сделана хорошим способом, но она кажется мне довольно тривиальной.

Как мне обращаться с самым концом файла, если осталось только 1,2 или 3 байта?

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

Итак, я просто храню буфер как unsigned int в структуре.Просто из любопытства, как мне преобразовать буфер в строку символов?

Зачем вам это делать?По вашим данным, «символ» составляет 4 байта.Но вы можете просто использовать приведение к массиву байтов, если хотите (или, лучше, использовать побитовые операции для извлечения фактических байтов, если порядок имеет значение).

...