7

我想从 git packfile 索引中获取幻数,以确保它确实是一个包文件。包格式文档指出幻数是“/377tOc”。例如,当我用 Ruby 打开包文件时,我会在读取文件时得到它:

> File.open("pack-4412d2306cfe9a0b6d1b9b4430abc767022e8a3c.idx").read(4)
=> "\377tOc"

但是在 Haskell 中,我得到了这个:

> h <- openFile "pack-4412d2306cfe9a0b6d1b9b4430abc767022e8a3c.idx" ReadMode
> Data.ByteString.hGet h 4
=> "\255tOc"

我认为我遗漏了一些明显的东西,但我不清楚那是什么。我在这里做错了什么?

4

1 回答 1

11

非 ascii 字符 ('\255') 只是以十进制显示,而不是八进制。

确认,根据od前 4 个字节确实是八进制/ASCII 或 1 字节十进制:

> $ od -c foo.idx  | head -1
0000000 377   t   O   c  \0  \0  \0 002  \0  \0 002 250  \0  \0 005   B

> $ od -t u1 /tmp/x | head -1
0000000 255 116  79  99   0   0   0   2   0   0   2 168   0   0   5  66

在 Haskell 中:

> s <- Data.ByteString.readFile "foo.idx"
> Data.ByteString.take 4 s
"\255tOc"

所以,请记住十进制的 255 是八进制的 377。

于 2011-04-07T22:45:36.413 回答