24小时热门版块排行榜    

CyRhmU.jpeg
查看: 931  |  回复: 3

opticer

金虫 (小有名气)

[求助] 为什么用CFile读出来的字节顺序是反的

我想读一个文件,文件最开始是一个带符号的4字节整形常量,每个字节如下:
0x88  10001000
0x1b  00011011
0x03  00000011
0x6f  01101111
也就是这4个字节合在一块组成一个为:
0x881b036f
的有符号整数 这个值应该为 -2011495569。
下面是读这个值的简单代码,读出来发现字节顺序好像是反的,怎么回事?

CFile file(lpszPathName, CFile::modeRead|CFile::typeBinary);
LONG *pbuf = new LONG[1];
file.Read(pbuf, 4);

查看 pbuf 指向的值是 0x6f031b88,和我原先的值刚好反了,这里面有什么讲究吗?
需要怎样才能调过来呢?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
cenwanglai(金币+5): 谢谢回复 ~~ 2012-03-06 00:22:38
jjdg说的即是,确实是高位和低位字节的原因。

我测试了一下,用c++把int类型的数字1写进了一个二进制文件里面,里面的内容(使用xxd -b)是:
00000001 00000000 00000000 00000000
低位到高位是由左到右排的。

我不在linux下面写程序,所以不方便测试MFC函数的程序。

或许也有其他方案,不过把输入文件里面的高低位顺序做个调整,是最直观的办法吧。。。
很女子很弓虽大
2楼2012-02-26 06:34:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lurencyj

木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★
xzhdty(金币+1): 欢迎常来程序语言看看 2012-02-26 09:28:03
cenwanglai(金币+5): 谢谢回复~~ 2012-03-06 00:22:52
引用回帖:
2楼: Originally posted by lurencyj at 2012-02-26 06:34:11:
jjdg说的即是,确实是高位和低位字节的原因。

我测试了一下,用c++把int类型的数字1写进了一个二进制文件里面,里面的内容(使用xxd -b)是:
00000001 00000000 00000000 00000000
低位到高位是由左到右排的。 ...

如果楼主不想变动原输入文件。。。。。。

那么,可以给你的代码加一个邪恶小补丁:
CODE:
CFile file(lpszPathName, CFile::modeRead|CFile::typeBinary);
char *TempChar = new char[sizeof(Long)];
file.Read(TempChar, sizeof(Long));

// 把读取到的TempChar数组的二进制逆序保存到一个临时文件
// 然后:
LONG *pbuf = new LONG[1];
file.Read(pbuf, 4);

//删除临时文件。。。

Good luck!
很女子很弓虽大
3楼2012-02-26 07:21:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mellon2011

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
cenwanglai(金币+5): 谢谢回复~~ 2012-03-06 00:23:04
在计算机中多字节数据类型在存储区内有一个字节排序问题.Intel 32位处理器采用little endian即小端字节排序,具体为:最低有效字节放在存储器字节地址较低的单元,最高有效地址放在存储器字节地址较高的单元. 而有些处理器如SUN SPARC采用Big Endian即高端字节排序,具体为:最低有效字节放在存储器字节地址较高的单元,最高有效地址放在存储器字节地址较低的单元.

从你的结果描述可以看出,你在读一个4字节的整形量,pbuf指向了4字节存储区的最低字节位置,你用的机器cpu是Intel 或x86兼容的。因此读出的次序就如同你描述的那样。
4楼2012-02-26 10:50:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 opticer 的主题更新
信息提示
请填处理意见