求教:如何用c语言将big endian的二进制输入文件在读入时处理成little endian的?(有结构体)

ShiningIce 2006-08-24 04:53:17
由于使用的机器是little endian的,而给定的程序二进制输入集是big endian的,想在读入文件的时候将其转换为little endian的效果,要考虑有机构体的情况,请赐教。
...全文
469 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim_King_2000 2006-08-25
  • 打赏
  • 举报
回复
#include <windows.h>

inline void swap(BYTE *pby1, BYTE *pby2)
{
BYTE byTemp = *pby1;
*pby1 = *pby2;
*pby2 = byTemp;
}

int x = 0x12345678;
BYTE *pByte = static_cast<BYTE *>(&x);
swap(pByte, pByte + 3);
swap(pByte + 1, pByte + 2);
ShiningIce 2006-08-25
  • 打赏
  • 举报
回复
谢谢大家的热心,忘记先说我测试的平台是amd64位双核的机子
我先自己试试,遇到问题再来请教大家
fmddlmyy 2006-08-25
  • 打赏
  • 举报
回复
没有很好的办法。必须根据原始数据,确定每个需要调换的word和dword的偏移(可以弄一张表),然后逐一调换。
或者数据源主动将数据写成小尾。
如果是标准的C结构,可以用perl脚本直接从源文件读出偏移信息。
大耳 2006-08-24
  • 打赏
  • 举报
回复
#ifndef swap32
#define swap32(x) ((((x)&0xFF)<<24) \
|(((x)>>24)&0xFF) \
|(((x)&0x0000FF00)<<8) \
|(((x)&0x00FF0000)>>8) )
#endif

其实是自己做字节调换,
saoyu 2006-08-24
  • 打赏
  • 举报
回复
写错了,不好意思
htonl,htons同理可得,本地字节顺序向网络字节顺序,就是本地字节顺序-->big endian
saoyu 2006-08-24
  • 打赏
  • 举报
回复
ntohl ntohs是网络字节顺序向本地字节顺序转化(就是big endian向本地字节顺序),如果是intel的big endian-->little endian,如1234转成3412,单个字节内每一位顺序不变。如果是powerpc体系结构则是big endian-->big endian,即不作任何变化。

htonl,htons同理可得,本地字节顺序向网络字节顺序,就是little endian-->本地字节顺序
jixingzhong 2006-08-24
  • 打赏
  • 举报
回复
那写一个转换函数吧 ...

不过可能很麻烦 ...
yingge 2006-08-24
  • 打赏
  • 举报
回复
仿佛搞反了,应该是

ntohl转换双字,如传过来的是1234,转换之后就是4321

ntohs转换字,如传过来的是12,转换之后就是21

抱歉.
yingge 2006-08-24
  • 打赏
  • 举报
回复
网络字节顺序就是big endian的,这两个函数用在Intel机器上就可以将字或者双字转换成little endian

htonl转换双字,如传过来的是1234,转换之后就是4321

htons转换字,如传过来的是12,转换之后就是21

不要管什么结构体,只要你知道下一个读出来的是字还是双字就足够了。
ShiningIce 2006-08-24
  • 打赏
  • 举报
回复
这个仿佛是网络专用的吧
htons()和htonl()用来将主机字节次序转成网络字节次序,前者应用于16位无符号数,后者应用于32位无符号数

能否说详细些,谢谢
yingge 2006-08-24
  • 打赏
  • 举报
回复
用ntohl或者ntohs函数转换

69,373

社区成员

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

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