Как программное обеспечение сжатия данных считывает файл в виде чистого двоичного файла и делает вывод?

cs.stackexchange https://cs.stackexchange.com/questions/121856

Вопрос

У меня есть технология гибридной сжатия, которую я хочу реализовать, моя реализация (до сих пор): я могу кодировать строку в кодированную сжатую строку.Это двоичные строки.Например,

Я читаю тексты из текстового файла ->

Затем преобразуйте его в двоичную строку ->

Затем преобразуйте его в закодированную двоичную строку.

На данный момент я могу сохранить кодированную двоичную строку в текстовом файле, но я хочу знать, что сделано в целом.

Например, когда мы используем программное обеспечение WinRAR -

  1. не читает, как я сказал выше, он сжимает любой файл
  2. делает файл .rar как вывод
  3. Итак, как компрессор «прочитал» любой файл как чистая двоичная форма, и как он делает выходной файл?

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

Это было полезно?

Решение

Файл - это байтовый поток

Хотя ОСУ предоставляют некоторые колокольчики и свистки (такие как метаданные, или forks ), большинство определяют файл как последовательность 0 или более bytes .

Каждый байт в файле представляет собой числовое значение от 0 до 255 (включительно). Это не больше всего для этого.

формат файла - это способ придания значения байтам в файле

Для простого примера вы можете иметь файл, представляющий черно-белое изображение, где каждый байт имеет либо 0 (черный пиксель), либо 1 (белый пиксель), один ряд за другой. Возможно, первые два байта кодируют ширину изображения как 16-битное число, а второй два байта кодируют высоту как 16-битное число.

Этот пример очень неэффективен, поскольку каждый байт пикселя никогда не может использовать возможные значения 2-255. Вы можете прочитать о Теория информации.

"Текстовый файл" - это формат файла

в текстовом файле, каждое возможное значение 0-255 дается смысл, конкретная буква, номер, символ или символ «особый эффект», как новая линия. Вроде, как бы, что-то вроде. Строго говоря, в ascii Кодирование, только значения 0-127 имеют значение.

Есть много разных текстовых кодировков, хотя только несколько распространенных. В Unicode , символы не всегда 1 байт в длину.

Но давайте придерживаемся ASCII. Если вы храните «51A3» в качестве текста, значения байтов 53, 49, 97, 51 будут переходить в файл, поскольку они соответствуют «5», «1» и др.

Если вы храните шестнадцатеричное значение 0x51 и 0xa3, как bytes , то будут просто эти два байта (81, 163 в десятичном периоде.) Так что это половина количества байтов. Однако файл больше не является текстовым файлом, поскольку 163 не определено в ASCII.

Другие форматы файлов требуют специально построенного программного обеспечения

Текстовые файлы популярны, потому что вы можете открыть их в любом редакторе (Notepad, Nano). Как вы понимаете, они не очень космически эффективны.

Но не сложно написать свое собственное программное обеспечение. Вот пример.

#!/usr/bin/env python3

# PART 1 - WRITE BYTES TO A FILE

save_hex = "60b725f10c9c85c70d97880dfe8191b3"

print("Saving:", save_hex)

# group save_hex into groups of 2
save_ints = []
i = 0
while i < len(save_hex):
    # the 16 makes int() treat the value as hex
    integer = int(save_hex[i:i+2], 16)
    save_ints.append(integer)
    i+=2

print("Integer values:", save_ints)

# create a bytes object out of an array of numbers
save_raw = bytes(save_ints)

with open('myfile.raw', 'wb') as f:
    f.write(save_raw)



# PART 2 - READ BYTES FROM A FILE

with open('myfile.raw', 'rb') as f:
    contents = f.read()

print("Loaded: ", end='')
for byte in contents:
    print('{:02x}'.format(byte), end='')
print()
.

После выполнения этой проверки длина файла половина длины шестигранной строки. Кроме того, научитесь использовать инструмент Hexdump для проверки содержимого файла.

Python's's's's bytes Объекты есть много функций, но если вы используете основную идею Выше (список INTS в диапазоне 0-255 -> BYTES Object) и (итерация на объект Bytes и получить int в диапазоне 0-255), тогда вам не нужно слишком глубоко в деталях.

Вселогичное программное обеспечение сжатия обычно не понимает файлов, которые он компрессорует

Когда вы поместите файл MP3 в ZIP или RAR, программное обеспечение сжатия обрабатывает его как последовательность байтов, так же, как она будет лечить JPEG или EXE или HTML-файл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top