0

我有一个名为 s32 的多字节原始类型,我想从字节数组中读取它。

规格如下:

  • 它是一个 32 位有符号整数值,以 little-endian 顺序存储。

  • 负整数使用 2 的补码表示。

  • 它根据大小使用 1 到 5 个字节。每个字节将其低七位贡献给该值。如果设置了高(第 8 位)位,则下一个字节也是值的一部分。

  • 应用符号扩展:传播编码的最后一个字节的第七位以填充解码值的 32 位。

在 U32 的情况下 - 无符号 32 位我想出了这个(欢迎任何评论!)但不确定如何为 S32 修改它。

char temp = 0; 
u32 value = 0;
size_t index = 0;

for(int i = 0; i < 5; i++)
{
    if(i < 4)
    {
        temp  = 0x7F & buffer[index];
    }
    else
    {
        temp = 0x0F & buffer[index];
    }

    value |= temp << (7 * i);

    if(!(0x80 & buffer[index])) break;

    ++index;
}

谢谢大家!

4

2 回答 2

0

你在做一个小端系统吗?
如果是这样,下面应该可以解决问题。

if(!(0x80 & buffer[index])) 
{
  if(0x40 & buffer[index])  value = -value;
  break;
}

如果您在大端系统上需要小端值的负值,那就有点棘手了,但这个要求对我来说似乎很奇怪

于 2010-07-14T15:35:45.220 回答
0

我在这个问题的答案中SIGN_EXTEND发布了一个宏。对于您的代码,我会将您更改为,并将 SIGN_EXTEND 应用为u32 values32 value

// after loop close
SIGN_EXTEND(value, index * 7, u32);

使用该问题的公认答案,您会说:

if(value > (1 << (index * 7 - 1))
    value -= (1 << (index * 7));
于 2010-07-14T16:07:27.063 回答