反转一点打包算法

时间:2012-02-10 18:48:34

标签: c algorithm memory bit-packing

我正在尝试反转我将一堆无符号短路打包到内存中的算法。我试图扭转它,我得到正确的数字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;
}

我知道我正在做正确的事情,因为我收回了大量正确的数据,虽然根据我写入内存的数字,从每个读取的每个数字到每隔一个数字的任何内容都是错误的。

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

2 个答案:

答案 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)

哎哟,你的C代码有点伤了我的脑袋。你是否主张任何入学条件?写入RAM的方式只是没有检查就吓人了。此外,如果bStart大于6,则您的班次未定义。我的猜测是bStart&gt; 6是你的问题。顺便说一下,这根本不是C ++代码,而是C语言。