我正在尝试将int
值转换为byte array
,但我正在使用byte
获取MIDI信息(意味着0x00 byte
使用GetBytes
充当分隔符时返回,这使得我的MIDI信息无效。
我想将int
转换为array
,其中不包含0x00字节,只包含包含实际值的字节。我怎么能这样做?
答案 0 :(得分:1)
你完全误解了你需要的东西,但幸运的是你提到了MIDI。您需要使用MIDI定义的多字节编码,这有点类似于UTF-8,因为每个八位字节中放置的数据少于8位,其余部分提供有关所用位数的信息。
见the description on wikipedia。密切注意protobuf使用这种编码的事实,你可以重用一些谷歌的代码。
答案 1 :(得分:0)
根据Ben补充的信息,这应该符合您的要求:
static byte[] VlqEncode(int value)
{
uint uvalue = (uint)value;
if (uvalue < 128) return new byte[] { (byte)uvalue }; // simplest case
// calculate length of buffer required
int len = 0;
do {
len++;
uvalue >>= 7;
} while (uvalue != 0);
// encode (this is untested, following the VQL/Midi/protobuf confusion)
uvalue = (uint)value;
byte[] buffer = new byte[len];
for (int offset = len - 1; offset >= 0; offset--)
{
buffer[offset] = (byte)(128 | (uvalue & 127)); // only the last 7 bits
uvalue >>= 7;
}
buffer[len - 1] &= 127;
return buffer;
}