簡體   English   中英

將整數編碼為可變長度的big-endian字節數組

[英]Encode integer as variable-length big-endian byte-array

我需要將一個整數寫入字節數組,以便省略前導零,並且以大端順序寫入字節。

例:

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)
{

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

根據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,則此版本不寫任何內容。

請注意,您正在將該值保存到可變的Length字節數組中。 如果保存這些byteArray,則還需要保存長度。

您可以從BinaryWriter中看到受保護的函數Write7BitEncodedInt,從BinaryReader中看到Read7BitEncodedInt。

這些功能將磁盤上的存儲空間保存為正數。 0-128號僅需要一個字節。

保存到Stream時,Microsoft使用這些函數來存儲/檢索String長度前綴。

要使用這些功能,您可以創建自己的從BinaryReader / BinaryWriter派生的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM