繁体   English   中英

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

[英]C++ Reading signed 32-bit integer value

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

规格为:

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

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

  • 根据大小,它使用1到5个字节。 每个字节将其低7位贡献给该值。 如果高(第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;
}

感谢大家!

您正在使用小端系统吗?
如果是这样,则应采取以下措施。

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

如果您需要在大端序系统上使用小端序值的负数,那么它会比较棘手,但是这个要求对我来说似乎很奇怪

我在此问题答案中张贴了SIGN_EXTEND宏。 为了您的代码,我会改变你的u32 values32 value ,并应用SIGN_EXTEND为

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

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

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

暂无
暂无

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

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