socket通讯的字节顺序的问题

njallenwang 2001-09-03 04:32:10
winsock.h中提供了两个函数ntohl,ntohs只能转换ushort和ulong,对其它类型呢?(short,int,float,double...)
问题好象有点土啊,但我现在还不明白,能告诉我吗?
...全文
178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
njallenwang 2001-09-03
  • 打赏
  • 举报
回复
我在做java和c之间的通讯必须转换字节顺序,
对word和int16我已经转换成功,但对于float直接用htonl会截掉小数部分,不知如何解决?darkay(火凤凰)帮我! 
darkay 2001-09-03
  • 打赏
  • 举报
回复
同意楼上的说法,如果你要对一个32位的float数进行转换的话只要调用htonl即可.
告诉你一个秘密:htonl实际上就是高低位的呼唤(对于host是intel兼容CPU)也就是说:
0x12345678 -> 0x78563412而已,如果你要对大于32位的数据进行转换,只要根据这个规则转换就可以啦,给个示范:
__int64 hton64(__int64 host)
{
__int64 ret;
long high,low;
low = host & 0xFFFFFFFF;
host >>= 32;
high = host & 0xFFFFFFFF;
low = htonl(low);
high = htonl(high);
ret = 0;
ret = low;
ret <<=32;
ret |= high;
return ret;
}

#define ntoh64(net) hton64(net)
mengliu 2001-09-03
  • 打赏
  • 举报
回复
再网络中传输的字节顺序是一个标准。至于传输其它类型需要你自己的约定。
因为不同的体系结构有big-endianess和little-endianess。每一个接着都有自己的转换函数。
所以只要对多字节的书掉同样的 函数就行,不过注意的是int的位数。有的32为,有的64为呀。
cgaga 2001-09-03
  • 打赏
  • 举报
回复
字节序问题只存在于数据需要与非i386兼容机进行数据交换的时候
如果你的程序只是用tcp/ip来传送数据,所有运行你程序计算机都是i386兼容机
并且你并没用修改ip报头化,你就没有必要考虑此问题
如果你确定需要考虑网络字节序的话,
你可以参考一些unix网络编程书中的《外部数据表示》一章

njallenwang 2001-09-03
  • 打赏
  • 举报
回复
那怎么传有符号的数和符点?难道要自己移位?
activeboy 2001-09-03
  • 打赏
  • 举报
回复
不能,因为这是internet的字节顺序。internet只有WORD.和 DWORD。也就是不带符号的整形。

69,368

社区成员

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

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