我正在尝试编写Midi Sample Dump Standard的开源实现,并且我很难理解为什么我为来自我正在测试的设备的每个数据包计算的校验和与我的不一致设备正在发送校验和。 我写的代码是here,并且有关于SDS规范here的详细信息。希望有更多使用按位运算符经验的人可以找到我做错的事情!
答案 0 :(得分: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 ;