C ++在读取和写入Hex文件时遇到问题

时间:2015-02-16 23:11:17

标签: c++ encryption hex iostream

所以我试图从hex文件中读取,修改十六进制值,将新的十六进制值写入一个新文件。然后打开新文件,再次修改十六进制并将其重写为第三个文件。我正在对十六进制值进行非常简单的加密。

我用来阅读的功能就是休闲:

vector<unsigned char> readFile(istream& file){
    vector<unsigned char> returnValue;
    //grab first 32 values from infile
    for(int i = 0; i < 32 && !file.eof(); i++) {
        returnValue.push_back(file.get());
    }
    return returnValue;
}

我用来写的功能是休闲:

void WriteVectorU8(ostream &file, vector<u8> bytes, bool isEncrypt){
    for(int i = 0; i < bytes.size(); i++){
        u8 byteToWrite = isEncrypt ? encrypt(bytes[i] , curKey[keyPointer]) : decrypt(bytes[i], curKey[keyPointer]);
        incKeyPointer();
        if(i != 0 && i%2 == 0){
            file << " ";
        }
        file << hex << setw(2) << setfill('0') << int(byteToWrite);

    }
    file << endl;
}

以下是我打开文件的方式:

ofstream outFile;
outFile.open("tempName.bin", ios::binary);

我所看到的是我打开的第一个文件正在正确读取,IE文件.get()返回一个有效的十六进制值。 这方面的一个例子是文件中的值48ff,get()以十六进制检索48或以int检索72。 我还可以看到我的加密文件是用十六进制正确编写的,但是当我去阅读我新创建的加密文件时,可以说它的第一个值是81a4我只得到第一个字符,&#39; 8&#39 ;不是十六进制值&#39; 81&#39;我期待的,并且能够从我没有创建的第一个文件中获得。

1 个答案:

答案 0 :(得分:2)

ostream&#39; << operator格式化文本,而不是原始数据。对于您的尝试,您需要使用ostream::write()方法:

void WriteVectorU8(ostream &file, vector<u8> bytes, bool isEncrypt){
    for(int i = 0; i < bytes.size(); i++){
        u8 byteToWrite = isEncrypt ? encrypt(bytes[i] , curKey[keyPointer]) : decrypt(bytes[i], curKey[keyPointer]);
        incKeyPointer();
        file.write((char*)&byteToWrite, 1);
    }
}

您还在eof()函数中滥用readFile()(在尝试先阅读某些内容之前,您无法检查eof)。它应该更像是这样:

vector<unsigned char> readFile(istream& file){
    vector<unsigned char> returnValue;
    //grab first 32 values from infile
    for(int i = 0; i < 32; i++) {
        char ch = file.get();
        if (!file) break;
        returnValue.push_back(ch);
    }
    return returnValue;
}

或者:

vector<unsigned char> readFile(istream& file){
    vector<unsigned char> returnValue;
    //grab first 32 values from infile
    char ch;
    for(int i = 0; (i < 32) && (file.get(ch)); i++) {
        returnValue.push_back(ch);
    }
    return returnValue;
}