问下 htons、htonl、ntohs、ntohl 的代码??

okmnji79513 2009-05-19 02:40:27
RT 这些函数具体是怎么完成该功能的?代码是什么样的?
...全文
522 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
okmnji79513 2009-05-22
  • 打赏
  • 举报
回复
感谢各位 结了
autumn1225 2009-05-20
  • 打赏
  • 举报
回复
long myhtonl(long i)
{
char *p = (char*)&i;
*p ^= *(p+3);
*(p+3) ^= *p;
*p ^= *(p+3);

*(p+1) ^= *(p+2);
*(p+2) ^= *(p+1);
*(p+1) ^= *(p+2);
return i;
}
armylau 2009-05-19
  • 打赏
  • 举报
回复
这种著名的API,去google code search或koder/cobase一搜,各种版本的实现都有

cadhy 2009-05-19
  • 打赏
  • 举报
回复

好帖
Conry 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hurryboylqs 的回复:]
主要用在套接字API函数上
其他地方好像很少用
[/Quote]
跨平台的二进制文件也需要,我前几天刚好遇见这个问题

lz如果自己实现这些函数的话,也不复杂
首先判断cpu的类型,如果是大端的 直接返回不作处理
如果是小端的就用上面列出的代码计算一下再返回

至于怎么判断cpu类型

google一下有好多
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
!!!!!!

如果我的 9楼 不像 12楼 那样改的话,会有什么后果??(我现在测 是没什么问题,但是会有何 隐忧??)
lcgboy 2009-05-19
  • 打赏
  • 举报
回复
楼上都说了,那我就顶一下吧
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hu_zhi_de 的回复:]
要改一下:
ULONG myhtonl(ULONG u)
{
ULONG temp=0;
memcpy((char*)&temp,(char*)&u+3,1);
memcpy((char*)&temp+1,(char*)&u+2,1);
memcpy((char*)&temp+2,(char*)&u+1,1);
memcpy((char*)&temp+3,(char*)&u,1);

return temp;
}
[/Quote]

这改一下是什么意思??
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 greatws 的回复:]
就是移位,htonl和这差不多


C/C++ code
u_short htons(u_short us)
{
return ((us & 0xff00) >> 8) | ((us & 0xff) << 8);
}
[/Quote]

了解了
xghuzd 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 okmnji79513 的回复:]
那 我在Windows环境下 写一个函数:

C/C++ code
ULONG myhtonl(ULONG u)
{
ULONG temp=0;
memcpy(&temp,&u+3,1);
memcpy(&temp+1,&u+2,1);
memcpy(&temp+2,&u+1,1);
memcpy(&temp+3,&u,1);

return temp;
}


是否可替代 htonl 函数来使用??
[/Quote]

要改一下:
ULONG myhtonl(ULONG u)
{
ULONG temp=0;
memcpy((char*)&temp,(char*)&u+3,1);
memcpy((char*)&temp+1,(char*)&u+2,1);
memcpy((char*)&temp+2,(char*)&u+1,1);
memcpy((char*)&temp+3,(char*)&u,1);

return temp;
}

或是用楼10的方法.
blackcat242 2009-05-19
  • 打赏
  • 举报
回复
可以找个linux下的代码看下,里面有
greatws 2009-05-19
  • 打赏
  • 举报
回复
就是移位,htonl和这差不多


u_short htons(u_short us)
{
return ((us & 0xff00) >> 8) | ((us & 0xff) << 8);
}

okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
那 我在Windows环境下 写一个函数:

ULONG myhtonl(ULONG u)
{
ULONG temp=0;
memcpy(&temp,&u+3,1);
memcpy(&temp+1,&u+2,1);
memcpy(&temp+2,&u+1,1);
memcpy(&temp+3,&u,1);

return temp;
}

是否可替代 htonl 函数来使用??
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
类似 ULONG --> 0000 0000 0000 0000 0000 0001 0001 0010 htonl后 是: 0001 0010 0000 0001 0000 0000 0000 0000 ?
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hust_terry 的回复:]
根据主机序和网络序的定义完成之间的转化,主要就是改变字节序。

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节…
[/Quote]

如果是windows的话:有一个USHORT ==18(即 0000 0000 0001 0010) ,那htons后就是4608(0001 0010 0000 0000)是这个意思不?
hurryboylqs 2009-05-19
  • 打赏
  • 举报
回复
主要用在套接字API函数上
其他地方好像很少用
hust_terry 2009-05-19
  • 打赏
  • 举报
回复
根据主机序和网络序的定义完成之间的转化,主要就是改变字节序。

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.

所以,一般网络程序都会先转为网络序和其他机器通信,其他机器收到后再转换为自己的主机序处理。
okmnji79513 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
主要就是改变网络字节顺序和主机字节顺序之间的转换
[/Quote]

那具体是怎么转换的呢?
oyljerry 2009-05-19
  • 打赏
  • 举报
回复
主要就是改变网络字节顺序和主机字节顺序之间的转换
oysoft 2009-05-19
  • 打赏
  • 举报
回复
不就是改变字节顺序吗
加载更多回复(1)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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