一尘不染

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

go

我在终端中压缩了文件compress file.txt并得到了(如预期的那样)file.txt.Z

当我将该文件传递到ioutil.ReadFileGo中时,

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

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

finder_test.go:116: lzw: invalid code

我发现,如果我使用compress/lzw软件包压缩文件,Go将接受该文件,而我只是使用这样做的网站上的代码。我只修改了那条线

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,go压缩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’s压缩的文件,而Go程序将仅接受使用Go’s压缩的文件compress/lzw

有人可以解释为什么会这样吗?为什么两个.Z文件不相等?我该如何克服呢?

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


阅读 218

收藏
2020-07-02

共1个答案

一尘不染

.Z文件不仅包含LZW压缩数据,而且Go
LZW代码也不会生成3字节的标头,因为它是用于压缩数据而不生成Z文件。

2020-07-02