我正在尝试将以十六进制表示的4个unsigned short int
数字写入二进制文件。
除了我写的数字外,我还会收到很多垃圾,我不确定为什么。我假设在从unsigned short int
到二进制的转换中,有垃圾被写入了我的文件。
我写入二进制文件的功能是:
int write_obj_file (char* name, unsigned short int array[rows] ){
FILE *fptr;
fptr = fopen(name, "wb");
if(fptr==NULL)
{
fclose(fptr);
return (0);
}
unsigned short int code = 0xABCD;
const void *ptr = &code;
fwrite(ptr, sizeof(ptr), 1, fptr);
unsigned short int code2 = 0x0000;
const void *ptr2 = &code2;
fwrite(ptr2, sizeof(ptr2), 1, fptr);
unsigned short int code3 = 0x0001;
const void *ptr3 = &code3;
fwrite(ptr3, sizeof(ptr3), 1, fptr);
unsigned short int code4 = 0x1101;
const void *ptr4 = &code4;
fwrite(ptr4, sizeof(ptr4), 1, fptr);
return (0);
}
理想情况下,二进制文件将被解释为:
ABCD 0000 0001 1101
但是我却要得到这个:
abcd f250 0190 0000 0000 eeb6 1915 7ffd
0001 eea6 1915 7ffd 1101 ee96 1915 7ffd
fwrite()
。您正在传递每个void*
变量的字节大小。 sizeof(void*)
在32位版本中为4个字节,在64位版本中为8个字节(在您的情况下,sizeof(void*)
似乎返回8)。您需要改为传递所指向的unsigned short int
变量的字节大小(2个字节)。
您根本不需要void*
变量。并且不要忘记错误检查:
int write_obj_file (char* filename, unsigned short int program_bin[ROWS] ){
FILE *fptr = fopen(filename, "wb");
if (fptr == NULL)
{
fclose(fptr);
return -1;
}
unsigned short int code = 0xABCD;
if (fwrite(&code, sizeof(code), 1, fptr) < 1) {
fclose(fptr);
return -1;
}
unsigned short int code2 = 0x0000;
if (fwrite(&code2, sizeof(code2), 1, fptr) {
fclose(fptr);
return -1;
}
unsigned short int code3 = 0x0001;
if (fwrite(&code3, sizeof(code3), 1, fptr) {
fclose(fptr);
return -1;
}
unsigned short int code4 = 0x1101;
if (fwrite(&code4, sizeof(code4), 1, fptr) {
fclose(fptr);
return -1;
}
fclose(fptr);
return 0;
}