我在将图像文件读入缓冲区时遇到麻烦。当我读取普通的ascii文件时,一切都很好,但当涉及到图像文件时,我怀疑图像文件中是否有\ 0字符?
我需要输入图像文件,将其解析为16KB的块以进行哈希处理,但是当我这样做时
std::ifstream ifs;
ifs.open(file_name, std::ifstream::binary | std::ifstream::in);
.
.
.
std::string block;
char buffer[BLOCK_SIZE];
.
.
.
memset(buffer, 0, BLOCK_SIZE);
ifs.read(buffer, BLOCK_SIZE);
block = buffer;
std::cout << i << " | block size: " << block.length()
<< " | buffer size: " << strlen(buffer) << std::endl;
hash = sha256(block); // string type required for openssl's function
Run Code Online (Sandbox Code Playgroud)
我懂了
0 | block size: 4 | buffer size: 4
1 | block size: 16 | buffer size: 16
2 | block size: 88 | buffer size: 88
3 | block size: 57 | buffer size: 57
4 | block size: 109 | buffer size: 109
5 | block size: 26 | buffer size: 26
6 | block size: 65 | buffer size: 65
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?例如,我怀疑
junkjunkjunk\0junkjunkjunk
Run Code Online (Sandbox Code Playgroud)
图像文件具有随机\ 0
您不能使用strlen()获取二进制数据的长度,因为它是用于获取以null终止的C样式字符串的长度。使用=运算符to 分配二进制数据std::string也是一个坏主意。
您可以使用函数std::istream::gcount()来获取由上一个read()或其他未格式化的输入操作读取的长度。
#include <iostream>
#include <fstream>
#include <cstring>
int main(){
const int BLOCK_SIZE = 16 * 1024;
const char* file_name = "test.dat";
int i = 0;
std::ifstream ifs;
ifs.open(file_name, std::ifstream::binary | std::ifstream::in);
char buffer[BLOCK_SIZE];
memset(buffer, 0, BLOCK_SIZE);
ifs.read(buffer, BLOCK_SIZE);
std::cout << i << " | buffer size: " << ifs.gcount() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |