C++ C++;在文件中写入半字节

C++ C++;在文件中写入半字节,c++,fstream,put,nibble,C++,Fstream,Put,Nibble,晚上好,, 我是C++新手,遇到了一个问题,尽管我在这里读了无数页,但还是没能解决。我有一个包含HexValue的文件,需要读取和压缩,然后写入一个新文件。示例序列如下所示: C9 CB FF 01 06(每个字节[8位]代表一个数字) 压缩从第一个数字开始,然后只将差异写入下一个数字(差异是一个半字节[4位])。从C9到CB的示例:差=2。如果差值大于7,因此不能用半字节表示,则使用0x8标记新的开始。0xFF-0xCB>7,因此序列如下所示(整个压缩代码): C9 28 FF 15(整个字节

晚上好,, 我是C++新手,遇到了一个问题,尽管我在这里读了无数页,但还是没能解决。我有一个包含HexValue的文件,需要读取和压缩,然后写入一个新文件。示例序列如下所示:

C9 CB FF 01 06(每个字节[8位]代表一个数字)

压缩从第一个数字开始,然后只将差异写入下一个数字(差异是一个半字节[4位])。从C9到CB的示例:差=2。如果差值大于7,因此不能用半字节表示,则使用0x8标记新的开始。0xFF-0xCB>7,因此序列如下所示(整个压缩代码):

C9 28 FF 15(整个字节的混合(0xC9和0xFF)表示数字,半字节表示与下一个数字的差异。现在我的问题是。我使用fstream和put将字节写入一个新文件,半字节存储为与另一个半字节合并到一个可以写入该文件的字节。但是,它只适用于小于128的字节,因此我无法将大于0x7F的值写入一个fILE。我用记事本+ +准备了一个文件,值0xff--读取那个值很好,但是<代码> Dest.PoT(源代码。()),在这个特定的情况下,< /COD>不。我如何工作(签名)的NBBLE(负差异)和C++中的数字二进制表示?这是我的代码,希望你能理解我的问题,我非常感谢你的帮助

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;
}
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=(字符)((无符号字符)c-(无符号字符)lastValue);
如果(abs(差异)>7){
if(半字节集){

D.PoT(可以把你能写的最小大小写在C++中的文件中,或者任何我熟悉的语言,至少是8个比特,至少在现代体系结构上是的(我以前在DEC-10上工作过)。若要写入较小的值,您必须将较小的值与其他较小的值一起缓冲,直到它填满8位,然后再写入。什么类型的
d
?它是如何获得其值的?另外,为什么您要使用
char
,这可能是有符号的,而不是
无符号的char
,这是保证不会出现的?@NeilButterworth是的,我尝试缓冲较小的值,直到它达到8位(请参见highNibble作为缓冲区),但put需要一个字符,不接受超过8位的值127@DavidSchwartzs是源文件(读取),d是目标文件(写入)。两者都是fstream类型。差异也可能是负值C9-CB=-2,所以我需要char,不是吗?@neophoenix对于
C9-CB
,您想在文件中写入什么?您想在文件中写入
-2
吗?如果是,那么您就有一个严重的问题。从
00
FF
的范围涵盖了所有可能的val字节的ue——没有剩余的值可以编码
-2