我如何将每个字节放入列表中

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

如何将 youtube 字幕放入列表中?

我有列表作为列值。如何将每个列表项放入自己的行中?

如何制作每个 CSV 行的子列表并将该子列表放入列表中

如何将服务器中每个用户的 id 放入数组中? (Discord.js v12)

遍历文件时,如何将每个文件名附加到列表中? [复制]