0

我正在尝试编写 Midi Sample Dump Standard 的开源实现,并且很难理解为什么我为来自我正在测试的设备的每个数据包计算的校验和与设备的校验和不匹配正在发送。我写的代码在这里,这里有关于 SDS 规范的好信息。希望有更多使用按位运算符经验的人可以发现我做错了什么!

4

1 回答 1

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 ;
于 2019-01-02T06:25:40.507 回答