大端存储的数据如何按小端读出来?(或者反之)

TTeN 2017-08-06 02:58:03
在用C++读取一数据文件,用FILE * fp=fopen(filename,"rb")打开后,
用fread读一个short int,
比如这个数实际上值为a=8023(0x1f57)
但用
short int a;
fread(&a,1,2,fp);
读出来的结果为 a=22303 (即 0x 571f)
查了下这是大小端的问题,
那我应怎么把这个转换过来 获得我想要的8023的结果呢?
或者说:
一个float型(因为这个文件中我还需处理float型),他的实际上为 0x 10 21 52 53
结果用我上述的办法读出来 为 0x 53 52 21 10
我应该如何得到我想要的实际结果呢?
求大神指点。
...全文
794 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TTeN 2017-08-09
  • 打赏
  • 举报
回复
如2楼和6楼所示, 最终思路为按字节(unsigned char)读取, 若是Int进行移位操作即可。 float型可先读成int,然后按照下面两条语句转为float float float_; *((int*)&float_) = int_num; float_即为想要的值。
赵4老师 2017-08-07
  • 打赏
  • 举报
回复
htonl,htons, ntohl, ntohs, WSAHtonl, WSAHtons, WSANtohl, WSANtohs
自信男孩 2017-08-07
  • 打赏
  • 举报
回复
从文件里不能直接转换之后读取,建议先将其读到内存里,然后在转换。比如short类型读到内存,然后再将两个字节转换一下。
u16 a = (a <<8) | (a >> 8); 
katie3000 2017-08-07
  • 打赏
  • 举报
回复
如一楼所述,大小端转换。
Langdex 2017-08-07
  • 打赏
  • 举报
回复
刚学不就,不知道这样做对不对,一个字节一个字节读,然后移位 int a,b; int c; fread(&a, 1, 1, fp); //0x57 fread(&b, 1, 1, fp); //0x1f c = (b << 4) | a; //0x1f57
jena_wy 2017-08-06
  • 打赏
  • 举报
回复
如果是四字节的整数倍,把第一和第四字节转换,把第二个字节和第三个字节转换

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧