Midi Sample Dump Standard的数据包校验和计算

Posted

技术标签:

【中文标题】Midi Sample Dump Standard的数据包校验和计算【英文标题】:Computing checksum for data packets of Midi Sample Dump Standard 【发布时间】:2013-10-13 22:18:47 【问题描述】:

我正在尝试编写 Midi 样本转储标准的开源实现,并且很难理解为什么我为来自我正在测试的设备的每个数据包计算的校验和与设备正在发送的校验和。 我写的代码是here,关于SDS 规范here 有很好的信息。希望有更多使用位运算符经验的人能发现我做错了什么!

【问题讨论】:

乍一看,您的代码符合校验和描述的要求。你能给我们完整的数据包和校验和来检查吗? 大多数 MIDI 协议不使用 XOR,而是使用加法来校验和; SDS 可能也不例外。 【参考方案1】:

自提出这个问题以来已经过去了 5 年,这在古老的 MIDI 样本转储标准的生命周期中只是一闪而过。对于其他寻求这种神秘知识的人,我将在这里给出答案。 MIDI 样本转储消息包含 21 字节的标头和可变数量的样本数据包,每个 127 字节(我们称它们为 0 到 126)。每个数据包在字节号 125 处都有一个校验和。它是通过对包中从字节号 1 到字节 124(含)的每个字节连续异或来计算的。然后将结果与 0x7F 进行与运算(将状态位清零)。这是从 libsndfile 中的“sds.c”提取的相关代码。请注意,此代码还验证字节 1 是 0x7E,这表明这是一个示例转储消息。

checksum = psds->read_data [1] ;
if (checksum != 0x7E)                      
   printf ("Error 1 : %02X\n", checksum & 0xFF) ;
    

for (k = 2 ; k <= SDS_BLOCK_SIZE - 3 ; k ++)
    checksum ^= psds->read_data [k] ;

checksum &= 0x7F ;

【讨论】:

以上是关于Midi Sample Dump Standard的数据包校验和计算的主要内容,如果未能解决你的问题,请参考以下文章

jstack 结果查看

TensorRT&Sample&Python[network_api_pytorch_mnist]

BLE MIDIMIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )

BLE MIDIMIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )(代码

MIDI是啥?

BLE MIDIMIDI 文件格式分析 ( MIDI 轨道分析 | MIDI 轨道头 | MIDI 轨道长度 | delta-time 间隔 )