Найти - Пользователи
Полная версия: Помогите перекодировать из bytes в string
Начало » Python для экспертов » Помогите перекодировать из bytes в string
1
extlife
Здравствуйте. Есть файл. Расширение *.bi5 - это обычные бинарные данные, сжатые с помощью алгоритма LZMA. Собстенно, задача состоит в том, чтобы вытащить эти бинарные данные и привести их в божеский вид(тестовый формат). Распаковать не составило никакого труда:
# -*- coding: utf-8 -*-
import lzma
path = '07h_ticks.bi5'
with lzma.open(path) as file:
    binary_file = file.read()
На выходе получается текстовый файл, но только вместо обычных символов в нем бинарные. Как это все сделать читабельным? При попытке вызвать метод decode() он начинает ругаться. Долго искал в интернете что-то похожее и нашел эту же задачу, но реализованную на плюсах. С сишными языками не дружу совсем, так что понять, как это работает так и не смог. Заранее спасибо за помощь.
JOHN_16
extlife
насколько я понял по исходникам, в распакованном файле бинарные данные идут группой по 6 значений (2 беззнаковых целых unsigned int и 4 дробных float) (это видно по функции tickFromBuffer).
Т.о. вам надо организовать в цикле считывание этих значений, делается это при помощи модуля struct.

P.S. коль тема для экспертов, то думаю код далее сами напишите
P.P.S. к сожалению я тоже не дружу с С, поэтому мог чего то не правильно понять. На форуме есть люди которые владеют С, когда подтянутся может поправят.
py.user.next
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, и получаем, что они нетекстовые.
extlife
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
Вроде все просто, а как это вытащить на свет, всю голову сломал )
py.user.next
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)
>>>
extlife
py.user.next
python.org. struct. пример
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB