我是编程新手,有时甚至我写的东西对我来说都是神秘的。这是我第一次在互联网上寻求帮助。
我在这里有一个问题,我现在已经有一段时间没办法解决了。
这就是我想要做的事情:
从文件中逐字节读取到向量中,修改字节并将其写回。
这是发生的事情:
所有的加密东西似乎都有效,但不知何故,在这些操作中的一些操作之后,文件的一部分会丢失。
在字节修改过程中,我使用char溢出,这意味着我在向量的每个部分添加一些随机数并将其整体写回。
在我看来,这可能是我不知道的某种算术溢出问题。
顺便说一句,我使用Qt SDK和Windows环境,以防万一。
这是代码片段:
void crypt(string * password,string filename, int sign){
vector<char> stack;
ifstream is;
is.open(filename.c_str());
char c;
for (int i = 0; !is.eof(); i++){
is >> noskipws >> c;
stack.push_back(c);
}
stack.pop_back();
is.close();
int code = 0;
double x;
char method = 0;
int var;
for (int i = 0; i < password->size(); i++)
code += password->at(i);
for (int i = 0; i < (stack.size()); i++){
// some unrelated stuff skipped
if (sign == 1)code += stack[i];
stack[i] += var*method*sign; //<----this might be the cause!
if (sign == -1)code += stack[i];
method = 0;
}
ofstream os;
os.open(filename.c_str());
for (int i = 0; i < stack.size(); i++){
os << noskipws << stack[i];
}
os.flush();
os.close();
}
对于代码中的混乱,我有点把它写进来进行测试。
任何想法都将受到赞赏。
答案 0 :(得分:3)
您正在以“文本”模式打开文件,这可能会导致问题,尤其是因为您的输出字符肯定会超出可打印的ASCII字符范围。这可能导致窗口问题,例如,当您尝试输出值0xD(回车)时,库会将其转换为0xD,然后是0XA(换行)。
因此,尝试以二进制模式打开文件,如下所示:
os.open(filename.c_str(), ios::binary);