我如何将每个字节放入列表中
Posted
技术标签:
【中文标题】我如何将每个字节放入列表中【英文标题】:How do i get each byte into a list 【发布时间】:2016-09-05 20:19:23 【问题描述】:我想打开一个 MIDI 文件并分析每个字节。但我对处理字节和位非常不熟悉。如果这有什么区别,Midi 会以十六进制编写。
我想要做的是将每个字节放入一个列表中,然后创建一个 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 格式解释链接,将不胜感激! :)
【问题讨论】:
contents = mFile.read()
。 contents
现在是一个字节数组,您可以使用 contents[n]
n 作为偏移量来访问它。它会给你字节的值
@Jean-FrançoisFabre “字节的值”是什么意思?当我打印内容时,我得到 b'MThd\x00\x00\x00\x06\x00 (等),如果我使用 fx contents[0],我得到 77。77 代表什么?以及如何以 xFF 格式获取它?谢谢!
77 是“M”的 ASCII 值。如果您需要字节序列而不是数字,请改为切片。
【参考方案1】:
刚刚完成了扫描前 40 个字节数据的代码。它使用类似 C 的 %
格式和更 Python 的 format
方法打印十进制值和十六进制值,如果格式规范是十六进制,这可能更容易理解。
midi 文件已下载 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]))
【讨论】:
完美运行!谢谢!不过,我还有最后一个问题; "x%02X"% contents[i] 行是做什么的/它是如何工作的?它只是将 77 更改为十六进制值吗? 它将值转换为十六进制字符串,仅用于显示/调试目的。要将整数与给定值进行比较,您可以这样做:contents[i]==0x4d
啊,有道理。非常感谢您的帮助!以上是关于我如何将每个字节放入列表中的主要内容,如果未能解决你的问题,请参考以下文章
如何将完整的 UserDefaults 列表放入 tableview - Swift 3