如何解码MIDI中的可变长度字段?在[1]中的描述只给出了一些例子,没有提到如果设置了最高有效位会发生什么。这是我当前的代码:
uint32_t MuStudio::MIDI::FileReader::varfieldGet()
{
// Note: always swap bytes on return since the loop reads in LE fashion since it
// it cannot be known a priori how many bytes to read
uint32_t ret=0;
uint8_t byte_in;
uint8_t k=0;
while(!m_source.eof())
{
byte_in=m_source.byteGet();
if(byte_in&0x80)
{
if(k==sizeof(ret))
{break;}
// How to continue here?
}
else
{return __builtin_bswap32(ret|(byte_in<<k));}
}
while(!m_source.eof() && byte_in&0x80)
{byte_in=m_source.byteGet();}
return __builtin_bswap32(ret);
}
[1] http://www.music.mcgill.ca/~我/类/mumt306/midiformat.pdf
变长值不是小端序而是大端序,但这并不重要,因为您每次读取一个字节并以本机字节顺序构造结果。
当你将一个字节与之前读过的位组合在一起时,你必须移动之前的位,而不是当前的字节。
当设置了最高有效位时,不需要做任何特殊操作;当该位清除时,必须停止:
uint32_t varfieldGet()
{
uint32_t ret = 0;
uint8_t byte_in;
for (;;)
{
if (m_source.eof())
// return error
byte_in = m_source.byteGet();
ret = (ret << 7) | (byte_in & 0x7f);
if (!(byte_in & 0x80))
return ret;
}
}