数据压缩软件如何将文件读为纯二进制文件并进行输出?
-
29-09-2020 - |
题
我有一个混合压缩技术我想要实现,我的实现是(到目前为止):我可以将字符串编码为编码的压缩字符串。这些是二进制字符串。例如,
我从文本文件中读取文本 - >
然后将其转换为二进制字符串 - > 然后将其转换为编码的二进制字符串。此时,我可以在文本文件中保存编码的二进制字符串,但我想知道一般所做的。
例如,当我们使用 WinRAR 软件时,它 -- 在我上面说的情况下没有阅读,它压缩了任何文件
- 使.rar文件作为输出
所以,压缩机如何将任何文件作为纯二进制形式,以及它如何使输出文件?
以另一种方式,我想要的是知道如何将任何文件读为纯二进制形式,并给出我具有编码和解码方案的输出文件。请评论与问题相关的任何内容,我是这个主题的新功能。
解决方案
文件是字节流
虽然SOSE提供了一些铃声和吹口哨(如元数据,或 forks ),大多数文件将文件定义为0或更多字节。
文件中的每个字节是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存储为字节,则将简单地是那些两个字节(十进制的81,163。),因此这是字节数的一半。但是,该文件不再是文本文件,因为163未在ASCII中定义。
其他文件格式需要目的内置软件
文本文件很受欢迎,因为您可以在任何编辑器(记事本,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的字节对象有很多功能,但如果你使用基本想法上面(范围0-255 - >字节对象的ints列表)和(迭代字节对象并在0-255范围内获取int),那么您不需要过于深入了解细节。
通用压缩软件通常不明白它压缩
的文件将mp3文件放入zip或rar时,压缩软件将其作为一系列字节序列,同样的方式处理JPEG或EXE或HTML文件。