我对C函数fwrite
有一个“有趣”的问题。我有一个unsigned int
指针,我想将它写入二进制文件,所以我使用了fwrite
。但是文件中的字节是颠倒的。考虑unsigned int
的大小(在我的情况下为4个字节),例如,如果我的数据是FE 45 78 D4 4C E9 EA F1
等,我将文件内容看作D4 78 45 FE F1 EA E9 4C
等。我该如何解决这个问题?
更多信息:当我说那个字节写错了顺序时,我的意思是我用来读取文件的每个程序都看错了顺序的字节,当然带来了读错误...我不明白为什么只有fwrite函数使用不同的方式来表示数据......
更多信息:
我试过了
fwrite(myuipointer,4,size,file);
fwrite(myuipointer,1,size*4,file);
同样的结果。 我还尝试使用指向我的数据的无符号字符指针并将其写入,但没有成功......
答案 0 :(得分:4)
这是因为您的计算机使用 little endian 存储语义。这意味着数字的 little 结尾是第一位的。您已经习惯于看到 big 结尾的数字(例如340,000
,其中千列在数字列之前。)
如果您的数据永远不会在 big endian 系统(如旧的PowerPC Mac)上读取,那么您可以通过这种方式编写数字,然后将它们读回同一系统,并且你会正确地订购它们。
如果您希望在使用不同字节序的系统之间共享此数据,则必须选择字节顺序,坚持使用,并在写入文件时执行到该字节顺序的转换。 (因为你不知道字节序的概念,我怀疑这不会对你发挥作用。)
答案 1 :(得分:1)
其他人已经在他们的答案中涵盖了字节顺序的概念,这是小端计算机上的预期行为。
但我看了你的其他一些问题,而你似乎正在使用JPEG文件,我的猜测是这就是问题?
JPEG文件需要在不同类型的计算机之间移植,不仅是小端和大端,还有32位和64位,依此类推。因此,JPEG定义了自己的标准大小和字节顺序,并且(如果不同)您需要将计算机的内部格式转换为JPEG格式。如果您只是将内部表示转储到文件,这是fwrite所做的,那么任何需要正确JPEG格式的程序都将失败。
如果您下载免费JPEG程序或库的源代码,例如libjpeg,您将看到它们不只是使用fread和fwrite,而是具有根据以下内容读取和写入每个字节的代码。 JPEG标准。
答案 2 :(得分:0)
查看小端和大端数字。存储的'Big-endian'整数首先存储最重要的位(整数),存储的'Little-endian'存储最低位的位。
尝试http://en.wikipedia.org/wiki/Endianness - 并非我依赖维基百科获取技术文章,但它只是简单地说。
答案 3 :(得分:0)
这称为字节顺序,您应该阅读维基百科网页(更常见的是关于计算机体系结构)以更详细地了解它。同时,如果要发出特定的字节模式来表示特定数据,请使用unsigned char数组。您无法使用fwrite
将结构,数组或基元类型写入磁盘文件(至少,您不能指望任何特定的输出模式),除非是unsigned char。
答案 4 :(得分:0)
这是因为您的计算机使用little-endian数据表示。这意味着整数等数据从最低有效字节开始存储在内存中
你的电话号码是:
FE 45 78 D4
4C E9 EA F1
将从最低有效字节开始表示:
D4 78 45 FE
F1 EA E9 4C
在使用big-endian数据表示的系统中读取此数据时应该小心,但如果您是唯一使用您的应用程序的人,或者您可以确定它只会在小端使用系统,你不必担心它。
P.S。:如果您需要在汇编时使用整数的最后两个字节(例如),这也可能是一个问题,您需要确切知道机器如何表示数据。