C++中.wav文件分块读取循环调用SHA1校验的实现方法问询
分块读取WAV文件计算SHA1哈希实现方案
核心逻辑说明
标准C/C++的文件流操作会自动维护文件内部指针偏移,每次读取操作完成后指针会自动跳转到已读内容的下一个字节位置,不需要手动计算偏移量。直接用fread批量读取即可,比逐字节调用fgetc的效率高很多。
实现代码
// 定义缓冲区最大长度,满足小于42000字节的要求 #define BUF_MAX_SIZE 42000 // 分配缓冲区 unsigned char DataBuffer[BUF_MAX_SIZE]; size_t read_bytes; // 循环读取直到文件结束 while ((read_bytes = fread(DataBuffer, 1, BUF_MAX_SIZE, WavResult)) > 0) { // 传入实际读取的字节数计算SHA1 util_sha1_calculate(&AuthContext, DataBuffer, read_bytes); }
关键注意点
fread的第二个参数是单个元素的大小,第三个参数是要读取的元素数量,这里设置单个元素为1字节,最多读42000个元素,返回值read_bytes就是实际读到的字节数- 最后一次读取时如果剩余文件内容不足42000字节,
read_bytes会返回剩余的实际字节数,直接传入SHA1函数即可,不会影响哈希计算结果 - 如果需要先跳过WAV的文件头只计算数据块的哈希,只需要在进入循环前用
fseek把文件指针跳到数据块的起始位置即可,后续循环的读取逻辑不需要修改
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

