Форум сайта python.su
Здравствуйте. Есть файл. Расширение *.bi5 - это обычные бинарные данные, сжатые с помощью алгоритма LZMA. Собстенно, задача состоит в том, чтобы вытащить эти бинарные данные и привести их в божеский вид(тестовый формат). Распаковать не составило никакого труда:
# -*- coding: utf-8 -*- import lzma path = '07h_ticks.bi5' with lzma.open(path) as file: binary_file = file.read()
Отредактировано extlife (Март 17, 2015 19:43:45)
Офлайн
extlife
насколько я понял по исходникам, в распакованном файле бинарные данные идут группой по 6 значений (2 беззнаковых целых unsigned int и 4 дробных float) (это видно по функции tickFromBuffer).
Т.о. вам надо организовать в цикле считывание этих значений, делается это при помощи модуля struct.
P.S. коль тема для экспертов, то думаю код далее сами напишите
P.P.S. к сожалению я тоже не дружу с С, поэтому мог чего то не правильно понять. На форуме есть люди которые владеют С, когда подтянутся может поправят.
Офлайн
extlifeПросто двоичные данные какие-то. Это не текст.
На выходе получается текстовый файл
>>> b[:100] b"\x00\x00\x00\x97\x00\x01\xa8$\x00\x01\xa8!?\xc0\x00\x00?\x80\x00\x00\x00\x00\x02\x90\x00\x01\xa8#\x00\x01\xa8 ?\x80\x00\x00?\x8c\xcc\xcd\x00\x00\x11\xfe\x00\x01\xa8#\x00\x01\xa8!?\x8c\xcc\xcd?\x80\x00\x00\x00\x00\x1a\x91\x00\x01\xa8#\x00\x01\xa8 ?\x8c\xcc\xcd?\x80\x00\x00\x00\x001\xa3\x00\x01\xa8#\x00\x01\xa8\x1f@'\xae\x14@\x86ff" >>>
extlifeЭто можно делать, если данные являются текстом в какой-то кодировке. Часто по нулям можно определить, текст это или нет.
При попытке вызвать метод decode() он начинает ругаться
>>> b'\x00\x00\x00\x97' b'\x00\x00\x00\x97' >>> b'\x00\x00\x00\x97'.decode('utf-32be') '\x97' >>>
>>> b'\x00\x01\xa8$' b'\x00\x01\xa8$' >>> b'\x00\x01\xa8$'.decode('utf-32be') '\U0001a824'
Отредактировано py.user.next (Март 18, 2015 00:19:18)
Офлайн
py.user.nextЕсть описание данного формата, и того, что в этом файле должно содержаться:
These ‘bi5’ files are LZMA compressed binary data files. The binary data file are formatted into 20-byte rows.Вроде все просто, а как это вытащить на свет, всю голову сломал )
32-bit integer: milliseconds since epoch
32-bit float: Ask price
32-bit float: Bid price
32-bit float: Ask volume
32-bit float: Bid volume
Офлайн
>>> import struct >>> >>> b = b'\x00\x00\x00\x97\x00\x01\xa8$\x00\x01\xa8!?\xc0\x00\x00?\x80\x00\x00' >>> >>> t = struct.unpack('>Iffff', b) >>> t (151, 1.5215298725638864e-40, 1.5214878336099566e-40, 1.5, 1.0) >>>
Офлайн
py.user.nextСпасибо.
python.org. struct. пример
Офлайн