如果必须使用以下参数,我该如何阅读文件的内容:
总的来说,我正在尝试计算这些部分的MD5值(您也可以将它们称为CHUNKS)。
已经计算了块的起始值和长度并将其存储在文件中。
我尝试使用fread()
如下,但它没有给我逻辑结果
char *chunk_buffer;
//chunk_buffer is a pointer to a memory block
while(cur_poly != NULL) {
//cur_poly is a structure which is used to store the start and length of chunks
chunk_buffer = (char*) malloc ((cur_poly->length)*8);
//here I am trying to allocate memory based on the size of each chunk
int x=fread (chunk_buffer,1, cur_poly->length, c_file);
//c_file is the file to be read according to the offsets
char hash[32];
hash=md5(chunk_buffer);
//md5() is a function which can generate the md5 hash values for the chunks
}
答案 0 :(得分:3)
我看到两个潜在的问题。
cur_poly->length
代表哪些单位?你正在将内存看作是一个64位字的计数,但是读取文件就好像它是字节一样。如果字段表示以字节为单位的长度,那么您正在正确读取,但分配的内存太多。但是,如果字段的长度为64位字,那么您将分配适当的内存量,但只读取数据的1/8。
代码似乎忽略了偏移量。 (或假设所有块必须是连续的)。如果你想从任意偏移读取,请在fread之前做fseek(fp, offset, SEEK_SET);
。
如果块应该是连续的,那么端部仍然可能存在填充以迫使它们全部在偶数边界上开始。每当字节数为奇数时,你就必须寻找填充(.WAV这样做,作为一个例子)
答案 1 :(得分:1)
我想要注意该代码的一些问题。您可能需要在这些点上添加更多详细信息。
如果要从文件中读取连续的块,通常不需要修改文件的获取指针。只需阅读一个块,然后阅读下一个。如果您需要以随机顺序读取块,则需要使用fseek。这样,您可以通过偏移量(从文件的开头或结尾或相对于当前位置)调整下一个文件操作的开始位置。
您有一个字符chunk_buffer
,您显然可以暂时存储文件中的数据。也就是说,它仅对当前循环迭代有效。
如果是这种情况,我建议您在进入循环之前执行malloc
一次:
char * chunk_buffer = malloc (MAXIMUM_CHUNK_SIZE);
在循环中,您可以使用memset
清除此缓冲区,或者只是覆盖数据。另请注意,malloc()
内存未使用'\0'
值进行初始化(我不知道这是否是您依赖的假设...)。
我不确定,为什么你实际上分配了一个大小为length*8
的缓冲区,只读了length
个字节。大概
int x = fread (chunk_buffer, SIZE_OF_ITEM, THIS_CHUNK_SIZE, c_file);
如果您的物品确实大于一个字节,会更贴近您的需求。
目前还不清楚md5()
函数实际上做了什么。它返回什么价值?指向动态分配的缓冲区的指针?指向本地数组的指针?无论如何,您将返回值分配给指向char
的本地数组的指针。您可能不需要为此分配32
个字节,只需
char * hash = md5 (chunk_buffer);
确保在循环进行下一次迭代时将指针指向该数组的某个位置。在该函数的本地范围内静态创建的数组当然不能以这种方式传递。
您的md5()
功能。怎么知道,块的大小是多少?它传递一个指针,但不是有效数据的大小(据我所知)。您可能需要调整此函数以将输入数组的长度作为附加参数。
md5()
函数产生什么,C风格的字符串(字母数字,以null结尾)或字节大小的无符号整数数组(uint8_t
)?
确保您free()
动态分配的内存。如果要将malloc()
保留在循环内,请确保循环始终以
free (chunk_buffer);
为了让我们为您提供进一步的帮助,您需要定义 a)你和你的逻辑结果是什么 b)你得到了什么结果