1

我已经在这里解决了我的问题,但我不明白它为什么会起作用,或者 MS 是否在这里。我没有编写此代码,但我维护它。它是 DSP 应用程序的一部分,将数据作为位向量处理,并且有时必须将它们从字节中打包和解包。

这些是打包和拆包的方法

template<class TData> void CVector<TData>::Enqueue(uint32_t iInformation, const int iNumOfBits)
{
    /* Enqueue bits in bit array */
    for (int i = 0; i < iNumOfBits; i++)
    {
        /* We want to put the bits on the array with the MSB first */
        /* Shift one bit to mask next bit at LSB-position */
        operator[](iBitArrayCounter + iNumOfBits - i - 1) = _BINARY(iInformation & 1);
        iInformation >>= 1;
    }
    iBitArrayCounter += iNumOfBits;
}

template<class TData> uint32_t CVector<TData>::Separate(const int iNumOfBits)
{
    uint32_t iInformation;
    if (iBitArrayCounter + iNumOfBits > iVectorSize)
        return 0;
    /* Separate out bits from bit-array */
    iInformation = 0;
    for (int i = 0; i < iNumOfBits; i++)
    {
        /* MSB comes first, therefore shift left */
        iInformation <<= 1;
        iInformation |= pData[iBitArrayCounter + i] & 1;
    }
    iBitArrayCounter += iNumOfBits;
    return iInformation;
}

在哪里

typedef unsigned char _BINARY;

现在,这已经在 Windows、Mac 和 linux 上的连续 MS 编译器和 gcc 上工作了很多年。它仍然适用于调试模式下的所有编译器。在发布模式下的 MSVC9(我认为这是 Visual Studio 2010 的版本)中,我必须将 Enqueue 方法中的行从:

        operator[](iBitArrayCounter + iNumOfBits - i - 1) = _BINARY(iInformation & 1);

至:

        if(iInformation & 1)
            operator[](iBitArrayCounter + iNumOfBits - i - 1) = 1;
        else
            operator[](iBitArrayCounter + iNumOfBits - i - 1) = 0;

该类是用 TData = _BINARY 实例化的。问题似乎是符号扩展,但入队和分离不是对称的。例如 65 被编码,然后分离为 193。

这是实际代码http://drm.cvs.sourceforge.net/viewvc/drm/drm/common/util/Vector.h?view=log的链接。1.8是修复。

我刚刚意识到应该用 TData 替换 _BINARY 宏,但在这种情况下,这无关紧要,因为无论如何都要用 _BINARY 实例化该类。

4

0 回答 0