C ++读取带符号的32位整数值

时间:2010-07-14 15:19:19

标签: c++ bytearray 32-bit signed

我有一个名为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;
}

谢谢大家!

2 个答案:

答案 0 :(得分:0)

您是否在使用小端系统? 如果是这样,应该做的伎俩。

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

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

答案 1 :(得分:0)

我在answer to this question中发布了SIGN_EXTEND宏。对于您的代码,我将您的u32 value更改为s32 value,并将SIGN_EXTEND应用为

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

使用接受的问题答案,你会说:

if(value > (1 << (index * 7 - 1))
    value -= (1 << (index * 7));