繁体   English   中英

反转7位整数编码

[英]Reversing 7-bit integer encoding

浏览现有代码库相对较大的代码时,发现以下功能:

int write_actual_size(unsigned int actual_size, int &out_size)
{
  unsigned char second;
  unsigned char third;
  unsigned char fourth;
  int result;
  int usedBytes;

  *(unsigned char *)out_size = actual_size | 0x80;
  if ( actual_size < 0x80 ) {
    *(unsigned char *)out_size = ((unsigned char)actual_size | 0x80) & 0x7F;
    result = 1;
  } else {
    second = (actual_size >> 7) | 0x80;
    *(unsigned char *)(out_size + 1) = second;
    if (actual_size < 0x4000) {
      *(unsigned char *)(out_size + 1) = second & 0x7F;
      usedBytes = 2;
    } else {
      third = (actual_size >> 14) | 0x80;
      *(unsigned char *)(out_size + 2) = third;
      if (actual_size < 0x200000) {
        *(unsigned char *)(out_size + 2) = third & 0x7F;
        usedBytes = 3;
      }
      else {
        fourth = (actual_size >> 21) | 0x80;
        *(unsigned char *)(out_size + 3) = fourth;
        if (actual_size < 0x10000000) {
          *(unsigned char *)(out_size + 3) = fourth & 0x7F;
          usedBytes = 4;
        }
      }
    }
    result = usedBytes;
  }
  return result;
}

根据原始输入大小,这会将一个普通的无符号整数编码为一个或多个字节。

据我了解,最左边的位用于确定是否有“后续”字节。 我认为这样做的原因是为了节省带宽(即使每个数据包最多3个字节)。 这些合理的假设吗?

我想制作一个read_actual_size版本...我可以将每个字节线性“右移7”直到遇到“ 0”吗?

请不要太苛刻,我对C还是很陌生。

通用VLQ解码器如下所示:

int decode_vlq(unsigned char *input)
{
    int result = 0;
    do
    {
        result = (result << 7) | (*input & 0x7F);
    }
    while (*input++ & 0x80);
    return result;
}

我乐于接受建议,因为我的C很生锈,我是手工编写的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM