我该怎么扭转这个? C#

时间:2015-10-18 05:21:37

标签: c#

您好我需要撤消此代码

    public static byte[] CreateProtocolBuffer(params int[] values)
    {
        List<byte> ptr = new List<byte>();
        for (int x = 0; x < values.Length; x++)
        {
            int value = values[x];
            while (value > 0x7F)
            {
                ptr.Add((byte)((value & 0x7F) | 0x80));
                value >>= 7;
            }
            ptr.Add((byte)(value & 0x7F));

        }
        return ptr.ToArray();
    }

例如:

int ID = 1000005;
byte[] ptr = CreateProtocolBuffer(ID);

我需要使用ptr中的值来获得1000005。

2 个答案:

答案 0 :(得分:1)

您发布的CreateProtocolBuffer方法中的代码将每个整数值编码为一个字节流,其中每个字节包含7位数据,并且&#39;继续&#39;标志(在高位)。根据编码的值,它可以产生1到5个字节的输出。

要反转编码,需要读取字节,直到找到高位清零的字节为止,将每个字节的7位复合在一起得到原始值。

这是您的代码的简单转换:

public static int[] FromProtocolBuffer(byte[] buffer)
{
    List<int> result = new List<int>();
    short shift = 0;
    int curr = 0;
    foreach (byte b in buffer)
    {
        curr = curr | (((int)b & 0x7F) << shift);
        if ((b & 0x80) == 0)
        {
            result.Add(curr);
            curr = 0;
            shift = 0;
        }
        else
            shift += 7;
    }
    return result.ToArray();
}

请注意,您不要尝试以这种方式对负值进行编码,否则它将无法正常工作。最好使整个事情适用于无符号整数。

答案 1 :(得分:1)

请检查一下,并考虑到建议的编码架构不能使用负数(有关存储在前导位中的符号的信息会丢失)。

public static int[] BackConversion(byte[] b)
{
    var result = new List<int>();
    int current = 0;
    int i_start = 0;

    for (int i = 0; i < b.Length; i++)
    {
        current += (b[i] & 0x7F) << (i - i_start) * 7;

        if ((b[i] & 0x80) == 0)
        {
            result.Add(current);
            i_start = i + 1;
            current = 0;
        }
    }

    return result.ToArray();
}

以下是如何使整个事物(编码/解码)与负数一起工作。在您的编码代码中将int value = values[x];替换为uint value = (uint)values[x];