簡體   English   中英

C ++在讀寫十六進制到文件時遇到問題

[英]C++ having issues reading and writing Hex to file

因此,我嘗試從十六進制文件讀取,修改十六進制值,將新的十六進制值寫入新文件。 然后打開新文件,再次修改十六進制並將其重寫為第三個文件。 我正在對十六進制值進行非常簡單的加密。

我用來閱讀的功能如下:

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);

我看到的是我打開的第一個文件被正確讀取,即file.get()返回有效的十六進制值。 一個示例是文件中的值48ff,並且get()以十六進制形式檢索48或將int檢索為72。 我還可以看到我的加密文件正確地以十六進制形式寫入,但是當我去讀取新創建的加密文件時,可以說其中的第一個值是81a4,我只得到第一個字符,“ 8”不是十六進制我期望並能夠從我未創建的第一個文件中獲取的值“ 81”。

ostream<<操作符將寫入格式化的文本 ,而不是原始數據。 對於您要嘗試的操作,您需要使用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);
    }
}

您還會在readFile()函數中濫用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM