Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2015 19:43:17

extlife
Зарегистрирован: 2014-08-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

Здравствуйте. Есть файл. Расширение *.bi5 - это обычные бинарные данные, сжатые с помощью алгоритма LZMA. Собстенно, задача состоит в том, чтобы вытащить эти бинарные данные и привести их в божеский вид(тестовый формат). Распаковать не составило никакого труда:

# -*- coding: utf-8 -*-
import lzma
path = '07h_ticks.bi5'
with lzma.open(path) as file:
    binary_file = file.read()
На выходе получается текстовый файл, но только вместо обычных символов в нем бинарные. Как это все сделать читабельным? При попытке вызвать метод decode() он начинает ругаться. Долго искал в интернете что-то похожее и нашел эту же задачу, но реализованную на плюсах. С сишными языками не дружу совсем, так что понять, как это работает так и не смог. Заранее спасибо за помощь.

Отредактировано extlife (Март 17, 2015 19:43:45)

Офлайн

#2 Март 17, 2015 22:28:14

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

extlife
насколько я понял по исходникам, в распакованном файле бинарные данные идут группой по 6 значений (2 беззнаковых целых unsigned int и 4 дробных float) (это видно по функции tickFromBuffer).
Т.о. вам надо организовать в цикле считывание этих значений, делается это при помощи модуля struct.

P.S. коль тема для экспертов, то думаю код далее сами напишите
P.P.S. к сожалению я тоже не дружу с С, поэтому мог чего то не правильно понять. На форуме есть люди которые владеют С, когда подтянутся может поправят.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 18, 2015 00:09:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

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'

Так как там три нуля, то это может быть utf-32. Берём два символа, которые якобы в utf-32, и получаем, что они нетекстовые.



Отредактировано py.user.next (Март 18, 2015 00:19:18)

Офлайн

#4 Март 18, 2015 00:47:50

extlife
Зарегистрирован: 2014-08-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

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
Вроде все просто, а как это вытащить на свет, всю голову сломал )

Офлайн

#5 Март 18, 2015 01:16:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

python.org. struct. пример

>>> 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)
>>>



Офлайн

#6 Март 18, 2015 01:18:57

extlife
Зарегистрирован: 2014-08-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите перекодировать из bytes в string

py.user.next
python.org. struct. пример
Спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version