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
)。
上一篇: 12 Bit Input in C++
下一篇: full featured HTML rendering engine like WebKit/Gecko for embedded Linux?