2

我正在尝试反转一种算法,该算法将一堆未签名的短裤打包到内存中。我试图扭转它,我得到正确的数字 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;
}

我知道我在做正确的事情,因为我得到了一堆正确的数据,尽管根据我写入内存的数字,从每四个到每一个读入的数字都是错误的。

有什么想法我在这里做错了吗?

4

2 回答 2

3

只是快速查看代码,它看起来应该可以正常工作,因为WORD is unsigned

我几乎敢打赌它不是,并且您的班次最终被签名(因此移入的高位不会为零,而是符号位的副本)

编辑:此外,由于您想要 10 位,您可能应该使用 *wVal &= 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;
}
于 2012-02-10T19:06:31.063 回答
0

哎哟,你的 C 代码让我有点头疼。你在断言你的任何入学条件吗?如果没有检查,你写到 RAM 的方式很可怕。此外,如果 bStart 大于 6,则您的班次未定义。我的猜测是 bStart > 6 是你的问题。顺便说一句,这根本不是 C++ 代码,而是纯 C。

于 2012-02-10T18:58:16.317 回答