我正在用C语言写一个二进制文件的结构。 char *项目和uint8项目写得很好,但我似乎在编写uint32项目时遇到问题。
我的写作代码在这里。
void writeOut(record *data){
FILE *fp = fopen("output.bin","w");
int i =0;
while(data[i].Name != NULL){
fwrite(data[i].Name, NAME_LEN ,1,fp);
fwrite(&data[i].Value1, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Value2, sizeof(uint8_t) ,1,fp);
fwrite(&data[i].Id, sizeof(uint32_t) ,1,fp);
fwrite(data[i].Text, TEXT_LEN ,1,fp);
i++;
}
}
我的二进制文件对于记录一(十六进制)看起来像这样(用'|'用于显示字段结尾指向):
52 6F 64 27 72 6F 64 00 00 00 00 00 00 00 00 00 00 | 01 | 04 | 72 92 01 00 | 50 72 6F 6A 65 63 74 20 50 65 61 63 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
或在十月
082 111 100 039 114 111 100 000 000 000 000 000 000 000 000 000 000 | 001 | 004 | 114 146 001 000 | 080 114 111 106 101 099 116 032 080 101 097 099 101 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
问题出在“72 92 01 00”或“114 146 001 000”块中。 它要包含的数字是'103026'
任何一个人都知道我在哪里出错?
注意到mods:不确定我选择的标签,欢迎调整。
-------- -------- UPDATE
感谢bin文件的输入。 好的,因为它写得正确,我一定是读错了。
它是我阅读的摘录
int populateRecordSet(unsigned int pageSize, FILE *recordFile, record** record_set){
// read in data
unsigned char data[RECORD_LEN * pageSize];
int numOfRecords = fread(data, RECORD_LEN, pageSize, recordFile);
// convert to records
int r_pos; //note r_pos is used to show the starting point of a record in the context of the binary file
int i;
uint32_t test;
for(i=0; i < numOfRecords; i++) {
r_pos = i * RECORD_LEN;
memcpy(record_set[i]->Name, data + r_pos, NAME_LEN);
//ADD NULL AT END JUST IN CASE
record_set[i]->Name[NAME_LEN] = '\0';
record_set[i]->Species = *(data + r_pos + (NAME_LEN));
record_set[i]->Class = *(data + r_pos + (NAME_LEN+SPECIES_LEN));
//record_set[i]->Id = *(data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN));
test = *(data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN));
printf("%s::%"PRIu32, record_set[i]->Name,test);
getchar();
memcpy(record_set[i]->Guild, data + r_pos + (NAME_LEN+SPECIES_LEN+CLASS_LEN+ID_LEN), GUILD_LEN);
record_set[i]->Guild[GUILD_LEN] = '\0';
}
getchar();
return i;
}
它对我来说是正确的,它适用于除“Id”
之外的所有值再次,任何见解?
答案 0 :(得分:5)
正如其他人所说,你的二进制表示看起来是正确的。但是,您应该查看用于访问此文件的模式。在编写二进制文件时,您应该以“wb”模式打开,并在读取“rb”时使用。
在* nix系统上它并不重要。在Windows上,根据我的经验,这很重要。错误的模式很容易导致后续读取无法正常工作。
答案 1 :(得分:4)
没有错。 72 92 01 00
是用于将数字103026表示为32位小端整数的正确字节序列。
答案 2 :(得分:3)
72 92 01 00是103026十进制的正确十六进制/字节表示,如果您打算将其写为little-endian(这意味着,最不重要的字节优先)。如果你把它写成little-endian并以big-endian(最重要的字节优先)读取它,那就是你的问题 - 在读写时字节顺序必须相同。