[英]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.