gpt4 book ai didi

c - 从文件加载 C 结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:20 25 4
gpt4 key购买 nike

我正在阅读一些mmap文件的代码,并将返回值分配给指向struct的指针:

struct cache_header {
unsigned int signature;
unsigned int version;
unsigned int entries;
unsigned char sha1[20];
};

struct cache_header *hdr;
map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
hdr = map;

稍后代码验证从文件加载的结构,这是我不明白的部分:

SHA_CTX c;
unsigned char sha1[20];
if (hdr->signature != CACHE_SIGNATURE)
return error("bad signature");
if (hdr->version != 1)
return error("bad version");
SHA1_Init(&c);
SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1));
SHA1_Update(&c, hdr+1, size - sizeof(*hdr));
SHA1_Final(sha1, &c);
if (memcmp(sha1, hdr->sha1, 20))
return error("bad header sha1");
return 0;

你能解释一下原因吗:

1.第二次调用SHA1_Update时有hdr+1

2.在memcmp的调用中,hdr->sha1是一个指针,它的值不是无效的吗,因为这个struct是刚从磁盘上读出来的,它是由代码库的另一个程序。

注意:size是文件的大小

最佳答案

  1. 也许文件大到足以包含该结构的两个实例? size 的值是多少?
  2. 不,hdr->sha1 不是指针,它是数组。该数组是 struct 的一部分,hdr->sha1 的计算结果为第一个元素的地址。那里没有存储指针。

另请注意,这是一种不好的做法,因为您在不确定的情况下依赖于打包(无填充)的结构

关于c - 从文件加载 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46587257/

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