gpt4 book ai didi

图像文件的C++ ifstream

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:55 31 4
gpt4 key购买 nike

我无法将图像文件读入缓冲区。当我读取普通的 ascii 文件时,一切都很好,但当涉及到图像文件时,我怀疑图像文件中有一个\0 字符?

我需要接收图像文件,将其解析为 16KB 的 block 以进行哈希处理,但是当我这样做时

 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

我明白了

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

如何解决这个问题?我怀疑,例如

junkjunkjunk\0junkjunkjunk

图像文件有随机\0

最佳答案

您不能使用strlen() 来获取二进制数据的长度,因为它用于获取以null 结尾的C 风格字符串的长度。使用 = 运算符将二进制数据分配给 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;
}

关于图像文件的C++ ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827132/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com