我在终端中使用 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/