从文件加载C结构

时间:2017-10-05 13:45:54

标签: c pointers struct

我正在阅读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); 是文件的大小

1 个答案:

答案 0 :(得分:2)

  1. 也许文件足够大,可以包含两个struct实例? size的价值是什么?
  2. 不,hdr->sha1不是指针,它是一个数组。该数组是struct的一部分,hdr->sha1计算第一个元素的地址。那里没有存储指针。
  3. 另请注意,这是不好的做法,因为您在没有确定的情况下依赖于structs被打包(无填充)。