晚上好, 我是C ++的新手,遇到了一个问题,尽管我在这里阅读了很多页面,但我无法解决这个问题。我有一个需要读取和压缩的十六进制文件,然后写入一个新文件。示例序列如下所示:
C9 CB FF 01 06(每个字节[8位]代表一个数字)
压缩从第一个数字开始,然后只将差异写入下一个数字(差异是半字节[4比特])。从C9到CB的示例:差值= 2.如果差值大于7,因此不能用半字节表示,我们使用0x8来标记新的开始。 0xFF-0xCB> 7所以序列看起来像这样(整个压缩代码):
C9 28 FF 15(整个字节(0xC9和0xFF)的混合表示数字和半字节表示与下一个数字的差异。现在我的问题。我使用fstream并将字节写入新文件,存储半字节以与另一个半字节组合到一个可以写入文件的字节。但它只适用于小于128的字节,因此我不能将大于0x7F的值写入文件。我准备了一个文件记事本++以值0xFF开头 - 读取该值效果很好但dest.put(source.get());
在这种特定情况下不起作用。如何使用(带符号)半字节[负面差异]和C ++中数字的二进制表示?顺便说一句,在file.put()中使用负数会导致奇怪的行为,因为写入2个字节而不是一个。这是我的代码,我希望你理解我的问题,我非常感谢你的帮助
int lastValue = s.get();
d.put((char)lastValue);
char highNibble = 0;
bool nibbleSet = false;
int diff = 0;
for (int c = s.get(); c != -1; c = s.get()) {
diff = (char)((unsigned char)c - (unsigned char)lastValue);
if (abs(diff) > 7) {
if (nibbleSet) {
d.put(highNibble << 4 | 8);
d.put((char)c);
nibbleSet = false;
}
else {
cout << (8 << 4 | (c & 0xF0) >> 4) << endl;
d.put(8 << 4 | (c & 0xF0) >> 4);
highNibble = c & 0x0F;
nibbleSet = true;
}
}
else {
if (nibbleSet) {
d.put(((char)highNibble << 4) & 0xF0 | ((char)diff) & 0x0F);
nibbleSet = false;
}
else {
highNibble = (char)diff;
nibbleSet = true;
}
}
lastValue = c;
}