我正在尝试反转我将一堆无符号短路打包到内存中的算法。我试图扭转它,我得到正确的数字50% - 75%的时间,所以我不确定我做错了什么。
这是将数字打包到内存中的算法:
BYTE packNumber(BYTE bStart, WORD value, BYTE * buffer, DWORD * counter)
{
value = (value<<(6-bStart));
*(buffer + *counter) |= (BYTE)(value>>8);
*(buffer + *counter+1) |= (BYTE)value;
bStart = (bStart+2)%8;
if (bStart)
*counter+= 1;
else
*counter+= 2;
return bStart;
}
连续几次调用它,将返回的bStart传递给下一个调用,直到所有数字都被打包到内存中。
这是我试图扭转它:
BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
*value= 0;
*value|= *(buffer + *counter);
*value= *value<< 8;
*value|= *(buffer + *counter+1);
*wVal = (*value>>(6-bStart));
bStart = (bStart+2)%8;
if (bStart)
*counter+= 1;
else
*counter+= 2;
return bStart;
}
我知道我正在做正确的事情,因为我收回了大量正确的数据,虽然根据我写入内存的数字,从每个读取的每个数字到每隔一个数字的任何内容都是错误的。
我在这里做错了什么想法?
答案 0 :(得分:3)
只需快速查看代码,看起来它应该正常工作 WORD是无符号的。
我几乎打赌它不是,你的班次最终被签名(因此移入的高位不会为零而是符号位的副本)
编辑:此外,由于你想要10位输出,你应该用* wVal&amp; = 0x03ff删除可能的额外高位。
这似乎适用于WORD无符号短语;
BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
*value= 0;
*value|= *(buffer + *counter);
*value= *value<< 8;
*value|= *(buffer + *counter+1);
*value = (*value>>(6-bStart)) & 0x3ff; // <-- remove extraneous bits
bStart = (bStart+2)%8;
if (bStart)
*counter+= 1;
else
*counter+= 2;
return bStart;
}
答案 1 :(得分:0)