如何高效获取匹配位标志的MIDI SysEx数据条目列表?
高效筛选匹配指定位标志的条目方案
需求概述
寻找高效方法,从数据中筛选匹配指定位标志的条目。
数据结构抽象
- 1字节 group code(组码)
- 4字节(32位)flags(标志)
- 标志描述名称字符串
- 标志唯一ID整数
每组最多32个条目,最多128组(组码首位始终为0),理论共4096个可能条目,实际约150条分布在5组。数据可存储于SQLite数据库,也可转为字典列表等格式,以检索效率优先。
需处理传入的包含组码和32位标志的十六进制字符串,返回所有置位标志对应的名称与ID。
具体场景示例(MIDI SysEx数据处理)
需将乐器发来的MIDI SysEx命令与存储的标志描述数据匹配,生成命令中置位标志的条目列表。
示例数据
instruments = [{"id": 1, "group": 0x00, "flag": 0x00200000, "name": "Bass"}, {"id": 2, "group": 0x00, "flag": 0x00000800, "name": "Trumpet"}, {"id": 3, "group": 0x10, "flag": 0x00004000, "name": "Violin"}, {"id": 4, "group": 0x18, "flag": 0x00010000, "name": "Chimes"}, {"id": 5, "group": 0x18, "flag": 0x00000200, "name": "Flute"}, {"id": 6, "group": 0x18, "flag": 0x00000800, "name": "Wooden Flute"}, {"id": 7, "group": 0x10, "flag": 0x00000200, "name": "Horn"}]
待匹配传入数据
midiData1 = 0x1000400200 midiData2 = 0x1800000A0
其中midiData1是组0x10中标志0x00004000和0x00000200的或运算结果,midiData2是组0x18中标志0x00000200和0x00000800的或运算结果。
预期输出
result1 = [{"id": 3, "group": 0x10, "flag": 0x00004000, "name": "Violin"},{"id": 7, "group": 0x10, "flag": 0x00000200, "name": "Horn"}] result2 = [{"id": 5, "group": 0x18, "flag": 0x00000200, "name": "Flute"}, {"id": 6, "group": 0x18, "flag": 0x00000800, "name": "Wooden Flute"}]
即解析或运算后的数据,返回所有置位标志对应的条目。
寻求最优方案
需要最优的存储与检索方案,包括SQLite内置位掩码查询、Python本地检索等,以实现高效匹配。
内容的提问来源于stack exchange,提问作者Ben Franske
相关产品推荐
相关产品推荐

