C ++中的12位输入

我正在尝试编写一个支持12位输入和输出的小应用程序。 我有输出工作,通过使用每个字12位可以写入数字4095到0到一个文件。 基本上,输入应该读取该文件(因此,读取数字4095到0)。 输入文件必须有一个32字节的缓冲区(即从文件中填充缓冲区,以12位块的形式读取,保存多余的位,重新填充缓冲区并重复)。

为了测试这个,我有一个循环,将'i'从4095减少到0.在循环内部,我请求12Bit输入类给我下一个12位数字。 理想情况下,这应该等同于'我'。

我相信我的逻辑工作,但由于某种原因,循环总是失败,一旦我达到4078.输入类返回值3822,而不是所需的4078,尽管它使用相同的逻辑和所有数字之前,按预期工作。 我知道到达缓冲区末尾没有问题(我还没有实现该部分),因为这个数字位于缓冲区的25.5到27个字节。 我不知道为什么它在这一点上失败。

输入类的代码:

int IStream12Bits::fetchCode()
{
    byte data[2];
    cout << "fByteCount: " << fByteCount << endl;
    if(!(fByteCount % 3)){
        cout << "!!! START OF BYTE !!!" << endl;
        data[0] = fBuffer[fByteCount];
        data[1] = (fBuffer[fByteCount + 1] & 0xF0);
        fByteCount++;
    }
    else{
        cout << "!!! MIDDLE OF BYTE !!!" << endl;
        data[0] = fBuffer[fByteCount];
        data[1] = fBuffer[(fByteCount + 1)];
        data[0] = ((data[0] & 0x0F) << 4);
        int temp = data[1];
        temp = temp >> 4;
        data[0] = (data[0] + temp);
        data[1] = (data[1] & 0xF0);
        fByteCount += 2;
    }

    int result = 0;
    fByteIndex = 0;
    fBitIndex = 8;

    for(int i = 0; i < 12; i++){
        if(data[fByteIndex] & (1 << (fBitIndex - 1))){ //if the MSB is 1, write it to the result
            result += (1 << i);
        }
        fBitIndex--;

        //if at the end of the byte, move on to the next
        if(fBitIndex == 0){
            fByteIndex = 1;
            fBitIndex = 8;
        }
    }

    return result;
}

编辑:

所有固定。 问题部分在于掩盖,部分在我的阅读中。 我所要做的只是直接从fBuffer中读取,因为算法是这样的,fBitIndex在一次读取后会减少到4(导致下一次读取在一个字节的中途自动开始)。 无需将数据掩盖并将数据复制到单独的阵列中。 原来我只是让自己变得更加复杂。


用于“解码”12位值的代码太复杂了。

对于“均匀”情况,你有这样的位:

fBuffer[n] fBuffer[n+1] // var
76543210   76543210     // bit offsets
AAAAAAAA   BBBB....     // value

你需要:

result
BA9876543210
AAAAAAAABBBB

请注意,“A”已上移4个位置,“B”下移4个位置。 将其转换为C ++:

result = (fBuffer[n] << 4) + ((fBuffer[n+1] & 0xF0)>>4);

对于“奇怪”的情况:

fBuffer[n] fBuffer[n+1]
76543210   76543210     // bit offsets
....AAAA   BBBBBBBB

你需要:

result
BA9876543210
AAAABBBBBBBB

请注意,这次“A”已经上移了8个位置,而“B”不需要任何移位。 将其转换为C ++:

result = ((fBuffer[n] & 0x0F) << 8) + fBuffer[n+1];

这就是解码流所需要的全部内容(假设您使用的是未签名类型)。

还有其他的东西很腥,但是在初始reload之后我没有看到reload的调用。 这是一个问题。


啊哈,很难调试这样的东西!

data[1] = (data[1] & 0xF0)

我认为这应该说

data[1] = ((data[1] & 0x0F) << 4)

因为您已经在前一行使用了data[1] & 0xF0 (作为data[1] >> 4 )。

链接地址: http://www.djcxy.com/p/51829.html

上一篇: 12 Bit Input in C++

下一篇: full featured HTML rendering engine like WebKit/Gecko for embedded Linux?