Чтение STR из бинарного файла дана длину в байтахPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Чтение STR из бинарного файла дана длину в байтах

Сообщение Anonymous »

У меня есть двоичный файл со следующей структурой: < /p>
• Byte 0: file version number (2)
• The remaining bytes represent records, which are composed of the following information:

– 2 bytes: lane number (uint16)
– 4 bytes: tile number (uint32)
– 2 bytes: read number (uint16)
– 2 bytes: indexLength, the length in bytes of index name (uint16)
– indexLength bytes: string representing index name
< /code>
остальное следует за этим форматом. Я прочитал в первом наборе элементов без проблем, но я подвесил наилучший способ декодировать длину индекса строки, учитывая байты, представляющие его. Нет доступной информации, которую я могу найти при кодировании, поэтому я пошел с UTF-8. < /P>
samples: list[dict] = [] # empty list to hold sample dicts

with open(path, "rb") as f:
# get file version (first byte)
version = struct.unpack("B", f.read(1))[0]
logger.debug(f"IndexMetricsOut.bin file version: {version}")

while True:
# fixed fields chunking
# lane (2), tile (4), read (2), indexLength(2)
fixed_format = "HIHH"
size = struct.calcsize(fixed_format)
chunk = f.read(size)

# if end of file
if not chunk:
logger.debug(f"End of file reached")
break

# assign fixed byte variables
lane, tile, read_num, index_len = struct.unpack(fixed_format,
chunk,
)
logger.debug(f"lane: {lane}, tile: {tile}, "
f"read_num: {read_num}, index_len: {index_len}")

def unpack_helper(fmt, data):
size = struct.calcsize(fmt)
return struct.unpack(fmt, data[:size]), data[size:]

# decode and assign index_name based on index_len

index_name_bytes = f.read(index_len)

# TO DO: troubleshoot decoding issue at index name

index_name = index_name_bytes.decode(encoding = "utf-8")

print(index_name)
< /code>
Когда я печатаю значение index_name_bytes, это кажется гораздо больше, чем должно быть. Я вижу значение моего индекса в альфа-нучевых значениях в шестнадцатеричном коде: < /p>
tests.readindexbin::DEBUG: IndexMetricsOut.bin file version: 2
tests.readindexbin::DEBUG: lane: 1, tile: 65536, read_num: 21, index_len: 16705
b'CACTGTTA-TGAGACTTGC\x1ad\x06\x00\x00\x00\x00\x00\x1d\x00MMR_YPZ_PYI-1504_50898847_180\x07\x00default\x0 ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa9 in position 177: invalid start byte
< /code>
Я думаю, что я читаю слишком много значений, и должен быть лучший способ сделать это. Просто застрял. Большое спасибо за любую помощь. Я думаю, что я смотрел на это слишком долго.

Подробнее здесь: https://stackoverflow.com/questions/795 ... h-in-bytes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»