Получить магический номер из индекса git packfile в Haskell - PullRequest
6 голосов
/ 08 апреля 2011

Я хочу получить магическое число из индекса git packfile, чтобы убедиться, что это действительно packfile. В документации формата пакета указано, что магическое число равно "/ 377tOc". Например, когда я открываю пакетный файл с помощью Ruby, я получаю это обратно при чтении файла:

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

Но в Хаскеле я получаю это:

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

Я так понимаю, я упускаю что-то очевидное, но мне не ясно, что это такое. Что я тут не так делаю?

1 Ответ

10 голосов
/ 08 апреля 2011

Символ не 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

А в Хаскеле:

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

Итак, просто помните, что десятичное число 255 - это восьмеричное число 377.

...