现在我正在创建数据,但我得到了一个意想不到的结果。
这是我写的代码。
float f = 1.7005484e-09;
uchar b[4];
memcpy(&b, (unsigned char *)&f, 4);
std::ofstream fout("abc.bin", std::ios::out | std::ios::binary);
fout.write((const char *)&b, sizeof(float));
fout.close();
printf("%x%x %x%x\n", b[0],b[1],b[2],b[3]);
该文件的预期结果是“BAB8 E930”,但我得到的结果是“0”。
当我将fout.write((const char*)&b,sizeof(float));
替换为
fout.write((const char *)&b, sizeof(float)+1);
我得到的是'BAB8E93000'。
这里的问题是什么,如何解决这个问题??
您的代码中有几个未定义的行为。
uchar b[4];
假设对于编译器,float
的大小为4,请执行以下操作
uchar b[sizeof(float)];
memcpy(&b, (unsigned char *)&f, 4);
首先,您需要memcpy(b,...
,其次,您假设float
的大小是4,第三,您依赖于endianess
fout.write((const char *)&b, sizeof(float));
首先您需要fout.write((const char*)b,...
,然后您假设b的大小是sizeof(float)
printf("%x%x %x%x\n", b[0],b[1],b[2],b[3]);
假设b由memcpy完全设置,因此对于编译器,float
的大小至少为4
该文件的预期结果是“BAB8 E930”,但我得到的结果是“0”。
您可能会谈论生成的文件的内容(例如使用cat),在前面的注释中,预期的结果可以是:0
,而不是“BAB8 E930”
,当然是printf(“%x%x%x%x\n”,b[0],b[1],b[2],b[3])产生的输出;
。
您会混淆打印字符和以六元格式打印其代码,例如printf("%c“,'0')
(或putchar('0')
)生成0
,但如果您的编译器使用ASCII代码,则printf("%x”,'0')
生成30
。
fout.write((const char *)&b, sizeof(float)+1);
如果浮点数
的大小为4,这意味着您在b之后写入了一个字符,这也是一个未定义的行为