C# 在没有0x00字节的情况下,如何将整型数组转换为字节数组?

C# 在没有0x00字节的情况下,如何将整型数组转换为字节数组?,c#,C#,我试图将int值转换为字节数组,但我使用字节作为MIDI信息(这意味着使用GetBytes时返回的0x00字节充当分隔符),这使得我的MIDI信息无效 我想将int转换为数组,该数组不包含0x00字节,只包含包含实际值的字节。我该怎么做呢?你完全误解了你需要什么,但幸运的是你提到了MIDI。您需要使用MIDI定义的多字节编码,这在某种程度上类似于UTF-8,即每个八位字节中放入的数据少于8位,其余的提供有关所用位数的信息 看。请密切注意protobuf使用这种编码的事实,您可能可以重用一些Goo

我试图将
int
值转换为
字节数组
,但我使用
字节
作为MIDI信息(这意味着使用
GetBytes
时返回的0x00
字节
充当分隔符),这使得我的MIDI信息无效


我想将
int
转换为
数组
,该数组不包含0x00字节,只包含包含实际值的字节。我该怎么做呢?

你完全误解了你需要什么,但幸运的是你提到了MIDI。您需要使用MIDI定义的多字节编码,这在某种程度上类似于UTF-8,即每个八位字节中放入的数据少于8位,其余的提供有关所用位数的信息


看。请密切注意protobuf使用这种编码的事实,您可能可以重用一些Google的代码。

根据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;
    }
静态字节[]VlqEncode(int值)
{
uint uvalue=(uint)值;
if(uvalue<128)返回新字节[]{(byte)uvalue};//最简单的情况
//计算所需缓冲区的长度
int len=0;
做{
len++;
u值>>=7;
}而(U值!=0);
//编码(在VQL/Midi/protobuf混淆之后,这是未经测试的)
U值=(uint)值;
字节[]缓冲区=新字节[len];
对于(int offset=len-1;offset>=0;offset--)
{
缓冲区[offset]=(字节)(128 |(uvalue&127));//仅最后7位
u值>>=7;
}
缓冲区[len-1]&=127;
返回缓冲区;
}

哪个端点?大还是小?一个输入/输出示例将真正帮助我们确定您的意图。对于编码,细节很重要。我的意思是,当我将int 1转换为字节数组时,我不需要0x01 0x00 0x00 0x00,而只需要0x01。这个问题描述的措辞非常糟糕。你正在使用的系统没有附带任何文档,或者你是在进行逆向工程吗?UTF8与protobuf使用的编码(以及Midi,似乎)有很大不同-但是是的,protobuf代码应该可以很好地工作。也许wikipedia与protobuf使用的编码相同是错误的,但这是LSB优先,VLQ是MSB优先。@Ben-我可以确认protobuf总是LSB优先-所以维基百科可能是错的;引述:“变量中的每个字节(除最后一个字节外)都设置了最高有效位(msb)——这表明还有更多的字节。每个字节的低7位用于以7位为一组存储数字的两个补码表示,最低有效组优先。”,除了最后一组的MSB之外,简单地反转数组应该可以解决这个问题…@internetmw-这突出了为什么在指定编码细节时非常非常精确非常重要…感谢大家的提醒,这对所有这些都是全新的