go - 为什么使用 unix-compress 和 go compress/lzw 会产生不同的文件,而其他解码器无法读取?

标签 go compression file-format lzw

我在终端中使用 compress file.txt 压缩了一个文件并得到(如预期)file.txt.Z

当我将该文件传递给 ioutil.ReadFile 时在 Go 中,

buf0, err := ioutil.ReadFile("file.txt.Z")

我收到错误(上面的行是 116):

finder_test.go:116: lzw: invalid code

我发现如果我使用 compress/lzw 压缩该文件,Go 会接受该文件。包,我刚刚使用了 a website 中的代码就是这样做的。我只修改了该行

outputFile, err := os.Create("file.txt.lzw")

我更改了.lzw.Z 。然后使用生成的 file.txt.Z在顶部的 Go 代码中,它运行良好,没有错误。

注:file.txt为 16.0 kB,unix 压缩 file.txt.Z为 7.8 kB,并进行压缩 file.txt.Z是 8.2 kB

现在,我试图理解为什么会发生这种情况。所以,我尝试运行

uncompress.real file.txt.Z

但它不起作用。我得到了

file.txt.Z: not in compressed format

我需要使用压缩器(最好是 unix-compress )来使用 lzw-compression 来压缩文件然后在两种不同的算法上使用相同的压缩文件,一种是用C编写的,另一种是用Go编写的,因为我打算比较两种算法的性能。 C程序将只接受用 unix-compress 压缩的文件并且Go程序只会接受用Go的compress/lzw压缩的文件.

有人可以解释一下为什么会发生这种情况吗?为什么两个 .Z 文件不相等?我该如何克服这个问题?

注意:我正在 Mac 上的 VirtualBox 中安装 Ubuntu。

最佳答案

.Z文件不仅包含LZW压缩数据,还包含a 3-bytes header Go LZW 代码不会生成,因为它旨在压缩数据,而不是生成 Z 文件。

关于go - 为什么使用 unix-compress 和 go compress/lzw 会产生不同的文件,而其他解码器无法读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889664/

相关文章:

go - HTTP : server gave HTTP response to HTTPS client

email - 如何从 Go 发送电子邮件

linux - 如何在不解压的情况下检查存档文件的实际大小?

image - 煤层气图像文件格式: what is it?怎么读呢?

coq - .vo 文件的结构如何使 coqchk 可以使用它?

c++ - 我可以在cgo中使用c++吗?

c++ - 获取图片的压缩比

compression - 我认为 *.DDS 文件是为了快速加载?

testing - 输出文件的功能测试,当输出是不确定的(或低控制)

go - 查找高于均值的数字