将整数编码为可变长度大端字节数组

时间:2010-07-04 20:30:31

标签: c# endianness

我需要将一个整数写入一个字节数组,以便省略前导零,并以大端顺序写入字节。

示例:

int    original = 0x00123456;

byte[] encoded  = Encode(original);  //  == new byte[] { 0x12, 0x34, 0x56 };

int    decoded  = Decode(encoded);   //  == 0x123456

我的Decode方法:

private static int Decode(byte[] buffer, int index, int length)
{
    int result = 0;
    while (length > 0)
    {
        result = (result << 8) | buffer[index];
        index++;
        length--;
    }
    return result;
}

我正在努力想出一个Encode方法,该方法不需要临时缓冲区或以小端顺序写入后反转字节。有人可以帮忙吗?

private static int Encode(int value, byte[] buffer, int index)
{

}

3 个答案:

答案 0 :(得分:3)

private static int Encode(int value, byte[] buffer, int index)
{
    int length = 0;
    int valueCopy = value;
    while (valueCopy != 0)
    {
        valueCopy >>= 8;
        length++;
    }
    for (int i = 0; i < length; i++)
    {
        buffer[index + length - i - 1] = (byte)value;
        value >>= 8;
    }
    return length;
}

答案 1 :(得分:3)

根据OP的请求,这里是一个没有32位数字循环的版本:

private static int Encode(int value, byte[] buffer, int index)
{
    byte temp;
    bool leading = true;

    temp = (value >> 24) & 0xFF;
    if (temp > 0) {
      buffer[index++] = temp;
      leading = false;
    }

    temp = (value >> 16) & 0xFF;
    if (temp > 0 || leading == false) {
      buffer[index++] = temp;
      leading = false;
    }

    temp = (value >> 8) & 0xFF;
    if (temp > 0 || leading == false) {
      buffer[index++] = temp;
      leading = false;
    }

    temp = value & 0xFF;
    buffer[index++] = temp;

    return index;
}

使用32位数字循环的版本:

private static int Encode(int value, byte[] buffer, int index)
{
    int length = 0;

    for (int i = 3; i >= 0; i++) {
      byte temp = (byte)(value >> (8 * i));
      if (temp > 0 || length > 0) {
        buffer[index++] = temp;
        length++;
      }
    }

    return length;
}

请注意,如果输入只是0,则此版本不会写任何内容。

答案 2 :(得分:0)

请注意,您要将值保存到变量Length byte array。如果保存这些byteArray,则还需要保存长度。

你可以从BinaryReader看到受保护的函数Write7BitEncodedInt和来自BinaryReader的Read7BitEncodedInt。

这些功能可将磁盘上的存储空间保存为正数。数字0-128只需要一个字节。

Microsoft使用这些函数在保存到Stream时存储/检索字符串长度前缀。

要使用这些函数,您可以创建从BinaryReader / BinaryWriter派生的自己的类。