RT 这些函数具体是怎么完成该功能的?代码是什么样的?

解决方案 »

  1.   

    都是WinSocket API函数用于改变字节存储顺序的
      

  2.   

    根据主机序和网络序的定义完成之间的转化,主要就是改变字节序。不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
    最常见的有两种
    1. Little endian:将低序字节存储在起始地址
    2. Big endian:将高序字节存储在起始地址 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.所以,一般网络程序都会先转为网络序和其他机器通信,其他机器收到后再转换为自己的主机序处理。
      

  3.   

    主要用在套接字API函数上
    其他地方好像很少用
      

  4.   


    如果是windows的话:有一个USHORT ==18(即 0000 0000 0001 0010) ,那htons后就是4608(0001 0010 0000 0000)是这个意思不?
      

  5.   

    类似 ULONG --> 0000 0000 0000 0000 0000 0001 0001 0010   htonl后 是: 0001 0010 0000 0001 0000 0000 0000 0000 ?
      

  6.   

    那 我在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 函数来使用??
      

  7.   

    就是移位,htonl和这差不多
     u_short htons(u_short us)
     {
     return ((us & 0xff00) >> 8) | ((us & 0xff) << 8);
     }
      

  8.   

    可以找个linux下的代码看下,里面有
      

  9.   


    要改一下:  
    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的方法.
      

  10.   

    跨平台的二进制文件也需要,我前几天刚好遇见这个问题lz如果自己实现这些函数的话,也不复杂
    首先判断cpu的类型,如果是大端的 直接返回不作处理
    如果是小端的就用上面列出的代码计算一下再返回至于怎么判断cpu类型google一下有好多
      

  11.   

    这种著名的API,去google code search或koder/cobase一搜,各种版本的实现都有
      

  12.   

    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;
    }