我有一个名为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;
}
谢谢大家!
答案 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));