2016-09-05 6 views
1

Я хочу открыть MIDI-файл и проанализировать каждый байт. Но я ОЧЕНЬ незнакомы с обработкой байтов и бит. Midi's написаны в шестнадцатеричном формате, если это имеет какое-либо значение.Как получить каждый байт в список

Что я хочу сделать, это поместить каждый байт в список, а затем создать цикл for для проверки каждого из них. Как я могу это сделать?

Я пришел далеко (не очень далеко):

# Open MIDI file 
mFile = open("test.mid", 'rb') 

# Checks if file is MIDI 
hChunk = mFile.read(4) 
if hChunk != b'MThd': 
    raise ValueError('Not a MIDI file') 

print(mFile.read()) 

Кроме того, если кто-либо легко понять MIDI формат объяснительные ссылки, которые будут оценены! :)

+1

'содержимое = mFile.read()'. 'contents' теперь представляет собой массив байтов, доступ к которому можно получить с помощью' contents [n] 'n, являющегося смещением. Он даст вам значение байтов –

+0

@ Jean-FrançoisFabre Что вы подразумеваете под «значением байта»? Когда я печатаю содержимое, я получаю _b'MThd \ x00 \ x00 \ x00 \ x06 \ x00_ (и т. Д.), И если я возьму содержимое fx [0], я получу 77. Что представляет собой 77? И как мне получить его в формате xFF? Благодаря! – Sorrells

+0

77 - значение ASCII «M». Если вам понадобятся байтовые последовательности вместо цифр, тогда вместо этого нарисуйте. –

ответ

1

только что завершил свой код для сканирования первых 40 байтов данных. Он печатает десятичное значение, а также шестнадцатеричное значение, используя как форматирование C-like %, так и больше pythonic format, что может быть более понятно, если спецификация формата находится в шестнадцатеричном формате.

миди файл был загружен here и сохранены в директории скрипта (отсюда и странное __file__ материал для вычисления правильного реж при тестировании)

import os 

# Open MIDI file 
mFile = open(os.path.join(os.path.dirname(__file__),"MIDI_sample.mid"), 'rb') 

# Checks if file is MIDI 
hChunk = mFile.read(4) 
if hChunk != b'MThd': 
    raise ValueError('Not a MIDI file') 

contents = mFile.read() 
mFile.close() 

total_len = len(contents) 

for i in range(0,40): 
    print(contents[i],"x%02X"% contents[i],"x{:02X}".format(contents[i])) 
+0

Он отлично работает! Благодаря! Однако у меня есть последний вопрос; что делает строка «x% 02X»% content [i] do/как она работает? Это просто изменит значение 77 на шестнадцатеричное значение? – Sorrells

+1

преобразует значение в шестнадцатеричную строку, только для целей отображения/отладки. Чтобы сравнить целые числа с заданными значениями, вы можете просто: 'contents [i] == 0x4d' –

+0

А, имеет смысл. Большое спасибо за вашу помощь! – Sorrells