您好我需要撤消此代码
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。
答案 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];
。