问下 htons、htonl、ntohs、ntohl 的代码?? RT 这些函数具体是怎么完成该功能的?代码是什么样的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 都是WinSocket API函数用于改变字节存储顺序的 根据主机序和网络序的定义完成之间的转化,主要就是改变字节序。不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.所以,一般网络程序都会先转为网络序和其他机器通信,其他机器收到后再转换为自己的主机序处理。 主要用在套接字API函数上其他地方好像很少用 如果是windows的话:有一个USHORT ==18(即 0000 0000 0001 0010) ,那htons后就是4608(0001 0010 0000 0000)是这个意思不? 类似 ULONG --> 0000 0000 0000 0000 0000 0001 0001 0010 htonl后 是: 0001 0010 0000 0001 0000 0000 0000 0000 ? 那 我在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 函数来使用?? 就是移位,htonl和这差不多 u_short htons(u_short us) { return ((us & 0xff00) >> 8) | ((us & 0xff) << 8); } 可以找个linux下的代码看下,里面有 要改一下: 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的方法. 跨平台的二进制文件也需要,我前几天刚好遇见这个问题lz如果自己实现这些函数的话,也不复杂首先判断cpu的类型,如果是大端的 直接返回不作处理如果是小端的就用上面列出的代码计算一下再返回至于怎么判断cpu类型google一下有好多 这种著名的API,去google code search或koder/cobase一搜,各种版本的实现都有 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;} 按照书上的例子获取非客户端\区的消息是出错了 使用basetsd.h中定义的那些64位类型,是不是可以让程序在64位系统上运行效率更高呢? 修改树控件的图标 一个关于图像处理的问题,请大家进来帮忙解决!!!! 用NetShareEnum函数来枚举本机上的共享资源,当共享目录是中文时怎么不显示不出来? 求助:VC6下生成的.exe应用文件保存后的文件的格式 控件大小随窗口大小改变的问题(急~在线等...) SDI多文档结构怎么管理多视图? 请问怎样在工具栏按钮上显示文字 大二进制存入数据库??? 如何将一个编译好的C++算法加到主程序中 请问我到底还缺乏什么。
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.所以,一般网络程序都会先转为网络序和其他机器通信,其他机器收到后再转换为自己的主机序处理。
其他地方好像很少用
如果是windows的话:有一个USHORT ==18(即 0000 0000 0001 0010) ,那htons后就是4608(0001 0010 0000 0000)是这个意思不?
{
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 函数来使用??
u_short htons(u_short us)
{
return ((us & 0xff00) >> 8) | ((us & 0xff) << 8);
}
要改一下:
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的方法.
首先判断cpu的类型,如果是大端的 直接返回不作处理
如果是小端的就用上面列出的代码计算一下再返回至于怎么判断cpu类型google一下有好多
{
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;
}