2012-07-12 132 views
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); 

相同的结果。 我也尝试使用一个无符号的字符指针,指向我的数据和fwrite它,没有成功...

+1

似乎是一个排序问题。告诉我们你的'fwrite'是怎么样的,我们可以帮你纠正这个问题 – 2012-07-12 07:08:35

+3

你认为什么需要解决?有什么东西坏了? – 2012-07-12 07:08:50

+0

只是尝试读取您的数据并检查是否有任何错误。在此之前,我看不到问题。 – 2012-07-12 07:11:55

回答

0

调查小尾数和大尾数。存储的“Big-endian”整数首先存储在整数的最高位,存储的Little-endian存储最低有效位优先存储。

尝试http://en.wikipedia.org/wiki/Endianness - 不是说我会依靠维基百科获取技术文章,但它很简单。

4

这是因为您的电脑使用小尾数存储语义。这意味着的一小部分结束了。你看惯了的数字,其中末至上(如340,000,其中数千列而来的几十列前。)

如果您的数据将永远不会被一个大端系统上,如阅读一个旧的PowerPC Mac,那么你可以用这种方式编写你的数字,他们在同一个系统上读回它们,并且你可以正确地订购它们。

如果您希望在使用不同字节顺序的系统之间共享此数据,则必须选择一个字节顺序,坚持使用,并在写入文件时执行字节顺序转换。 (因为你不知道排序的概念,我怀疑这不会对你有用。)

0

这就是所谓的字节顺序,你应该阅读关于它的维基百科网页(也许关于计算机更一般的架构)来更​​详细地理解它。同时,如果你想发出特定的字节pattterns来表示特定的数据,请使用一个unsigned char数组。除非是无符号字符,否则不能使用fwrite将结构,数组或基元类型写入磁盘文件(至少不能指望任何特定的输出模式)。

0

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

FE 45 78 D4 
4C E9 EA F1 

将从最低显著字节开始表示:

D4 78 45 FE 
F1 EA E9 4C 

使用的大端表示在系统读取该数据时,您要小心数据,但是如果您是唯一使用您的应用程序的应用程序,或者您可以确定它只能用于小端系统,则无需担心。

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

1

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

但我看了一些其他的问题,你似乎正在处理JPEG文件,我的猜测是这是问题所在?

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

如果您下载免费的JPEG程序或库(如libjpeg)的源代码,您将看到它们不仅使用fread和fwrite,而且还拥有根据JPEG标准读取和写入每个字节的代码。

+0

是的,你猜对了,我正在使用jpeg ......但问题不仅在于jpeg格式,因为每个程序都以错误的顺序查看文件中的数据......我写入标记存储在无符号字符数组,并且每件事情都可以正常工作,但是当我写入一个unsigned int,bum,problems ... – user1466609 2012-07-12 08:36:44

+0

字符数组没有“字节顺序”,因为字符只是彼此相继存储,并且没有其他可能的顺序。但使用整数(无符号或有符号,短或长或正常),不同类型的计算机使用不同的格式在内部存储它们,而fwrite只会将该内部格式转储到文件中。所以,如果你想要一个可移植的方式将整数存储在一个文件中(而JPEG只是一个例子),你需要决定一个通用的格式,并将你的内部表示转换为该格式。 – 2012-07-12 08:40:46

+0

请注意,您在文件中看到的字节顺序并不是真正的“错误”顺序,它只是您的计算机在内部使用的顺序。如果你使用fread将它读回到一个变量中,它将会正常工作。 – 2012-07-12 08:48:01

相关问题