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

发布于 2024-09-09 02:51:05 字数 687 浏览 6 评论 0原文

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

规范为:

  • 它是一个 32 位有符号整数值,以小端序存储。

  • 负整数使用 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;
}

谢谢大家!

I have a multi-byte primitive type called s32 which I want to read from a byte array.

The specifications are:

  • It is a 32-bit signed integer value, stored in little-endian order.

  • Negative integers are represented using 2's complement.

  • It uses 1 to 5 bytes depending on the magnitude. Each byte contributes its low seven bits to the value. If the high (8th) bit is set, then the next byte is also a part of the value.

  • Sign extension is applied: the seventh bit of the last byte of the encoding is propagated to fill out the 32 bits of the decoded value.

In the case of U32 - unsigned 32-bit I come up with this (any comments welcomed!) but not sure how to modify it for 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;
}

Thanks everyone!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乖不如嘢 2024-09-16 02:51:05

您正在使用小端系统吗?
如果是这样,下面应该可以解决问题。

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

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

Are you working on a little-endian system?
If so following should do the trick.

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

If you need the negative of a little endian value on a big endian system, then it is a bit more tricky, but that requirement would seem very strange to me

暗恋未遂 2024-09-16 02:51:05

我在

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

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

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

I posted a SIGN_EXTEND macro in an answer to this question. For your code, I'd change your u32 value to s32 value, and apply SIGN_EXTEND as

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

using the accepted answer for the question, you'd say:

if(value > (1 << (index * 7 - 1))
    value -= (1 << (index * 7));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文