我正在阅读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;
稍后代码verifies
从文件加载的结构,这是我不明白的部分:
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.在hdr+1
SHA1_Update
hdr->sha1
2.在对memcmp的调用中,size
是一个指针,它的值无效,因为刚刚从磁盘读取了结构,并且它是由另一个代码库程序。
注意:var sensorInput = new { Latitude = 25, Longitude = 134 };
Log.Information("Processing {@SensorInput}", sensorInput);
是文件的大小
答案 0 :(得分:2)
size
的价值是什么?hdr->sha1
不是指针,它是一个数组。该数组是struct
的一部分,hdr->sha1
计算第一个元素的地址。那里没有存储指针。另请注意,这是不好的做法,因为您在没有确定的情况下依赖于structs
被打包(无填充)。