如何在没有0x00字节的情况下将int转换为字节数组?

时间:2010-09-19 15:40:12

标签: c#

我正在尝试将int值转换为byte array,但我正在使用byte获取MIDI信息(意味着0x00 byte使用GetBytes充当分隔符时返回,这使得我的MIDI信息无效。

我想将int转换为array,其中不包含0x00字节,只包含包含实际值的字节。我怎么能这样做?

2 个答案:

答案 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;
    }