入职后第一件工作用到了二进制和加密,做个笔记记录下坑。
1
unsigned char buf[contentSize]; // contentSize为待读取内容的字节数
rfile.read(buf, contentSize); // rfile为ifstream类型,以二进制方式打开
cout << buf << endl;
上面的buf
在读取1KB的文件时工作的很好,但是尝试用65KB的文件后,就出现了明明contentSize
是对的,但是只读了几十个字节的情况,打印出来也是乱码,原因不明,遂改为下面的代码,虽然强制把const转为非const是不太安全的做法。
string buf;
buf.resize(contentSize, 0x00);
// 严格来说按照C++语法应当使用const_cast进行类型转换
rfile.read((char *)buf.c_str(), contentSize);
cout << buf << endl;
2
openssl des 加解密和8字节补齐参考代码
3
声明结构体时,没有声明构造函数,于是在类似如下的循环里,局部变量里面的值并没有被初始化而是保留着上一次循环时的值。
for (int i = 0; i < 10; i++){
somestruct tmp; // somestruct是自定义的结构体
rfile.read(&tmp, sizeof(tmp)); // rfile为ifstream类型,以二进制方式打开
}
当rfile.read
没有读到任何信息时,tmp
虽然是个局部变量,但依然保留着上次循环的值,于是造成了“读到了内容”的假象。原因待google,开发环境是VS2008,win7-64bit。