gpt4 book ai didi

c++ - C++ 中的 12 位输入

转载 作者:可可西里 更新时间:2023-11-01 18:38:06 26 4
gpt4 key购买 nike

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

为了对此进行测试,我有一个将“i”从 4095 减少到 0 的循环。在循环内,我请求 12 位输入类给我下一个 12 位数字。理想情况下,这应该等同于“i”。

我相信我的逻辑在工作,但由于某种原因,一旦我到达 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。这是一个问题。

关于c++ - C++ 中的 12 位输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com