我试图从 SQLite 数据库文件中解析标题,使用这个(实际的片段)代码:
struct Header_info {
char *filename;
char *sql_string;
uint16_t page_size;
};
int read_header(FILE *db, struct Header_info *header)
{
assert(db);
uint8_t sql_buf[100] = {0};
/* load the header */
if(fread(sql_buf, 100, 1, db) != 1) {
return ERR_SIZE;
}
/* copy the string */
header->sql_string = strdup((char *)sql_buf);
/* verify that we have a proper header */
if(strcmp(header->sql_string, "SQLite format 3") != 0) {
return ERR_NOT_HEADER;
}
memcpy(&header->page_size, (sql_buf + 16), 2);
return 0;
}
以下是我正在测试的文件的相关字节:
0000000: 5351 4c69 7465 2066 6f72 6d61 7420 3300 SQLite format 3.
0000010: 1000 0101 0040 2020 0000 c698 0000 1a8e .....@ ........
按照这个规范,代码对我来说是正确的。
header->page_size
后来我用这一行打印:
printf("\tPage size: %"PRIu16"\n", header->page_size);
但是该行打印出 16,而不是预期的 4096。为什么?我几乎可以肯定这是我刚刚忽略的一些基本问题。