我有一个混合压缩技术我想要实现,我的实现是(到目前为止):我可以将字符串编码为编码的压缩字符串。这些是二进制字符串。例如,

我从文本文件中读取文本 - >

然后将其转换为二进制字符串 - >

然后将其转换为编码的二进制字符串。

此时,我可以在文本文件中保存编码的二进制字符串,但我想知道一般所做的。

例如,当我们使用 WinRAR 软件时,它 -

  1. 在我上面说的情况下没有阅读,它压缩了任何文件
  2. 使.rar文件作为输出
  3. 所以,压缩机如何将任何文件作为纯二进制形式,以及它如何使输出文件?

    以另一种方式,我想要的是知道如何将任何文件读为纯二进制形式,并给出我具有编码和解码方案的输出文件。请评论与问题相关的任何内容,我是这个主题的新功能。

有帮助吗?

解决方案

文件是字节流

虽然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文件。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top