1

我对 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);

同样的结果。我还尝试使用指向我的数据的无符号字符指针并将其写入,但没有成功...

4

5 回答 5

4

这是因为您的计算机使用小端存储语义。这意味着数字的端首先出现。您习惯于看到大端先出现的数字例如340,000,千位列在十位之前。)

如果您的数据永远不会在大端系统(例如旧的 PowerPC Mac)上读取,那么您可以通过这种方式写出您的数字,然后在同一系统上将它们读回,然后您就会得到正确的排序。

如果您希望在使用不同字节序的系统之间共享此数据,则必须选择一个字节顺序,坚持使用它,并在写入文件时执行与该字节顺序的转换。(由于您不了解字节序的概念,我怀疑这不会对您起作用。)

于 2012-07-12T07:11:28.620 回答
1

其他人在他们的答案中涵盖了字节顺序的概念,这是小端计算机上的预期行为。

但是我查看了您的其他一些问题,您似乎正在使用 JPEG 文件,我猜这就是问题所在?

JPEG 文件需要在不同类型的计算机之间移植,不仅是 little-endian 和 big-endian,还包括 32 位和 64 位等等。因此 JPEG 定义了自己的标准大小和字节顺序,并且(如果不同)您需要将计算机的内部格式转换为 JPEG 格式。如果您只是将内部表示转储到文件中,这就是 fwrite 所做的,那么任何期望正确 JPEG 格式的程序都会失败。

如果您下载免费 JPEG 程序或库的源代码,例如libjpeg,您会发现它们不仅使用 fread 和 fwrite,而且具有根据 JPEG 标准读取和写入每个字节的代码。

于 2012-07-12T08:15:43.247 回答
0

查看小端和大端数字。存储“Big-endian”的整数首先存储(整数的)最高位,存储“Little-endian”的整数首先存储最低有效位。

试试http://en.wikipedia.org/wiki/Endianness - 并不是说​​我会依赖 Wikipedia 来获取技术文章,但它很简单。

于 2012-07-12T07:11:03.523 回答
0

这称为字节顺序,您应该阅读有关它的维基百科网页(也许更普遍地了解计算机体系结构)以更详细地理解它。同时,如果要发出特定的字节模式来表示特定数据,请使用 unsigned char 数组。除了 unsigned char 的情况外,您不能可移植地使用fwrite将结构、数组或原始类型写入磁盘文件(至少,您不能期望任何特定的输出模式)。

于 2012-07-12T07:11:47.483 回答
0

发生这种情况是因为您的计算机使用小端数据表示。这意味着诸如整数之类的数据从最低有效字节开始存储在内存中。
你的号码是:

FE 45 78 D4
4C E9 EA F1

将从最低有效字节开始表示:

D4 78 45 FE
F1 EA E9 4C

在使用数据的大端表示的系统中读取此数据时应小心,但如果您是唯一使用您的应用程序的人,或者您可以确定它只会在小端系统上使用,您不必担心。

PS:如果您在汇编中需要获取整数的最后两个字节(例如),这也可能是一个问题,您需要确切地知道机器如何表示数据。

于 2012-07-12T07:52:21.507 回答