【问题标题】:Get magic number from git packfile index in Haskell从 Haskell 中的 git packfile 索引中获取幻数
【发布时间】:2011-04-07 22:30:53
【问题描述】:

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

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

但在 Haskell 中我得到了这个:

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

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

【问题讨论】:

    标签: git haskell bytestring


    【解决方案1】:

    非 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。

    【讨论】:

    • 谢谢唐,这正是我需要听到的。让我感到困惑的是,我认为 \ 表示它是八进制的。一些谷歌搜索出现了book.realworldhaskell.org/read/…,这表明八进制数字前面有一个哦,所以 \o377 == \255。这个附录是为了其他人的利益,因为你显然知道这一切:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多