精华内容
下载资源
问答
  • 网络字节序转换函数(64位)

    万次阅读 2009-08-17 11:14:00
    网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将网络数据流转换成本地数据流的话,需要进行字节序转换。 标准库里提供了hlton()和nthl()两...

    在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将

    网络数据流转换成本地数据流的话,需要进行字节序的转换。

     

    标准库里提供了hlton()和nthl()两个函数来支持转换。

    hston(unsigned short), hlton(unsigned long)  将本地字节序转换为网络字节序

    ntohl(unsigned long), ntohs(unsigned short)  将网络字节序转换为本地字节序

     

    但是对于64位的整数进行转换,标准库并没有提供相应的转换函数,本文将给出个人原创的64位字节序转换函数。

     

    #ifndef ULONG64

    #define unsigned long long ULONG64

    #endif

     

    // host long 64 to network

     

    ULONG64  hl64ton(ULONG64   host)   

    {   

    ULONG64   ret = 0;   

    ULONG   high,low;

     

    low   =   host & 0xFFFFFFFF;

    high   =  (host >> 32) & 0xFFFFFFFF;

    low   =   htonl(low);   

    high   =   htonl(high);   

    ret   =   low;

    ret   <<= 32;   

    ret   |=   high;   

    return   ret;   

    }

     

     

     

    //network to host long 64

     

    ULONG64  ntohl64(ULONG64   host)   

    {   

    ULONG64   ret = 0;   

     

    ULONG   high,low;

     

    low   =   host & 0xFFFFFFFF;

    high   =  (host >> 32) & 0xFFFFFFFF;

    low   =   ntohl(low);   

    high   =   ntohl(high);   

     

     

    ret   =   low;

    ret   <<= 32;   

    ret   |=   high;   

    return   ret;   

    }

     

     

     

    关于little endian和big endian的详细信息,网上的资料太多了,本文就不详述了。

     

     

    展开全文
  • 简述:将一个无符号短整型数从网络字节顺序转换为主机字节顺序。(16位)。 #include <netinet/in.h> uint16_t ntohs(uint16_t netshort); 输入uint16_t netshort:一个以网络字节顺序表达的16位数。 ...

    ntohs()

    简述:将一个无符号短整型数从网络字节顺序转换为主机字节顺序。(16位)。

    #include <netinet/in.h>
    uint16_t ntohs(uint16_t netshort);

    输入uint16_t netshort:一个以网络字节顺序表达的16位数。 

    返回值:uint16_t ntohs返回一个16位以主机字节顺序表达的数。

    功能:本函数将一个16位数由网络字节顺序转换为主机字节顺序。 

     

    htons() 

    简述:将一个无符号短整型从主机字节顺序转换为网络字节顺序。(16位)

    #include <netinet/in.h>
    uint16_t htons(uint16_t hostshort);

    输入uint16_t hostshort:一个以主机字节顺序表达的16位数。 

    返回值:uint16_t htons返回一个16位以网络字节顺序表达的数。

    功能:本函数将一个16位数从主机字节顺序转换成网络字节顺序。 

     

    ntohl()

    简述:将一个无符号长整形数从网络字节顺序转换为主机字节顺序。(32位)

    #include <netinet/in.h>
    uint32_t ntohl(uint32_t netlong);

    输入uint32_t netlong:一个以主机字节顺序表达的32位数。 

    返回值:uint32_t ntohl返回一个32位以网络字节顺序表达的数。

    功能:本函数将一个32位数从网络字节顺序转换成主机字节顺序。

     

    htonl()

    简述:将一个无符号长整形数从主机字节顺序转换为网络字节顺序。(32位)

    #include <netinet/in.h>
    uint32_t htonl(uint32_t hostlong);

    输入uint32_t hostlong:一个以主机字节顺序表达的32位数。 

    返回值:uint32_t htonl返回一个32位以网络字节顺序表达的数。

    功能:本函数将一个32位数从主机字节顺序转换成网络字节顺序。
     

     

    展开全文
  • -- 字节序转换函数主机一般采用小端字节序(也有采用大端字节序的),网络数据流采用大端字节序,为使同样的代码在大端和小端计算机上编译后都能正常运行,可以调用字节序转换函数网络字节序和主机字节序的转换。...

    -- 字节序转换函数

    主机一般采用小端字节序(也有采用大端字节序的),网络数据流采用大端字节序,为使同样的代码在大端和小端

    计算机上编译后都能正常运行,可以调用字节序转换函数做网络字节序和主机字节序的转换。

         

    当使用这些函数时,我们并不关心主机字节序和网络字节序的真实值(或为大端,或为小端) 。我们所要做的只是调用

    适当的函数在主机和网络字节序之间转换某个给定值。


    -- 地址转换函数


    展开全文
  • 字节序转换函数 需要包含头文件 #include <arpa/inet.h> 1.htons():把unsigned short类型从主机转换到网络序(h:host,主机;n:net,网络;s:unsigned short,16位短整数) 2.htonl():把unsigned ...

    字节序转换函数

    需要包含头文件
    #include <arpa/inet.h>

    1.htons():把unsigned short类型从主机序转换到网络序(h:host,主机;n:net,网络;s:unsigned short,16位短整数)
    2.htonl():把unsigned long类型从主机序转换到网络序(l:unsigned long,32位长整数)
    3.ntohs():把unsigned short类型从网络序转换到主机序
    4.ntohl():把unsigned long类型从网络序转换到主机序

    如果主机序是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机序是大端字节序,这些函数将不对参数做转换,将参数原封不动地返回。

    5.uint32_t htonl(uint32_t hostint32);
    功能:将32位主机字节序数据转换为网络字节序数据
    参数:hostint32,需要转换的32位主机字节序数据,uint32_t为32位无符号整型
    返回值:若成功,返回网络字节序的值

    6.uint16_t htons(uint16_t hostint16);
    功能:将16位主机字节序数据转换成网络字节序数据
    参数:hostint16,需要转换的16位主机字节序数据,uint16_t为16为无符号短整型
    返回值:若成功,返回网络字节序的值

    7.uint32_t ntohl(uint32_t netint32);
    功能:将32位网络字节序数据转换为主机字节序数据
    参数:netint32,需要转换的32位网络字节序数据,uint32_t为32位无符号整型
    返回值:若成功,返回主机字节序的值

    8.uint16_t ntohs(uint16_t netint16);
    功能:将16位网络字节序数据转换成主机字节序数据
    参数:netint16,需要转换的16位网络字节序数据,uint16_t为16为无符号短整型
    返回值:若成功,返回主机字节序的值

    示例:
    hton.c

    #include "../Head.c"
    int main()
    {
        int a=0x01020304;
        short b=0x0102;
        printf("主机序0x%08x转换成网络序为:0x%08x\n",a,htonl(a));
        printf("主机序0x%04x转换成网络序为:0x%04x\n",b,htons(b));
        return 0;
    }
    

    在这里插入图片描述

    地址转换函数:

    通常用户在表达地址时采用的是点分十进制标识的数值(或者是用冒号分开的十进制IPv6地址),而在通常使用地socket编程中使用的则是32位地网络字节序的二进制值,这就需要将这两个数值进行转换。早期的时候IPv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而需要注意的是早期的这些函数只能处理IPv4地地址,而且不可重入函数。
    函数原型:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    int inet_aton(const char* straddr,struct in_addr* addrptr);
    功能:将点分十进制的IP地址转换成网络字节序的32位二进制数值。
    参数:straddr,存放输入的点分十进制的IP地址字符串;addrptr,传出参数,保存网络字节序的32位二进制数值。
    返回值:成功返回1,失败返回0。
    char* inet_ntoa(struct in_addr inaddr);
    功能:将网络字节序的32位二进制数值转换为点分十进制的IP地址。
    in_addr_t inet_addr(const char* straddr);
    功能:将点分十进制的IP地址转换成网络字节序的32位二进制数值。
    返回值:若成功,返回32位二进制网络字节序地址。

    示例:
    addressconvert.c

    #include "../Head.c"
    int main()
    {
        char ip[]="192.168.0.101";
        struct in_addr address;
        //将点分十进制的IP地址转换成网络字节序的32位二进制数值
        int ret=inet_aton(ip,&address);
        printf("%x\n",address.s_addr);
        printf("%x\n",inet_addr(ip));
        ret=inet_pton(AF_INET,ip,&address);
        printf("%x\n",address.s_addr);
        address.s_addr=0xac100ac4;
    	
        //将网络字节序的32位二进制数值转换为点分十进制的IP地址
        printf("%s\n",inet_ntoa(address));
        inet_ntop(AF_INET,&address,ip,16);
        puts(ip);
        return 0;
    }
    

    在这里插入图片描述
    兼容IPv4和IPv6地址的函数原型:
    #include <arpa/inet.h>
    int inet_pton(int family,const char* strptr,void* addrptr);
    功能:将点分十进制的IP地址转换成网络字节序的32位二进制数值。
    参数:family,协议族,可取值AF_INET,AF_INET6,PF_PACKET等,该参数若指定为AF_INET,表示是IPv4协议,如果是AF_INET6,表示是IPv6协议;strptr,点分十进制数串;addrptr,32位无符号整数的地址。
    返回值:成功返回1,失败返回其他。

    示例:
    pton.c

    #include "../Head.c"
    int main()
    {
        char ip[]="172.20.223.75";
        unsigned int ip_uint=0;
        unsigned char* ip_p=NULL;
        inet_pton(AF_INET,ip,&ip_uint);
        printf("in_uint=%d\n",ip_uint);
    
        ip_p=(char*)&ip_uint;
        printf("in_uint=%d,%d,%d,%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3));
        return 0;
    }
    

    在这里插入图片描述
    const char* inet_ntop(int family,const void* addrptr,char* strptr,socklen_t len);
    功能:将网络字节序的32位二进制数值转换为点分十进制的IP地址。
    参数:family,协议族,可取值AF_INET,AF_INET6,PF_PACKET等,该参数若指定为AF_INET,表示是IPv4协议,如果是AF_INET6,表示是IPv6协议;addrptr,32位无符号整数的地址;strptr,点分十进制数串;len,strptr缓冲区长度。
    len的宏定义:
    #define INET_ADDRSTRLEN 16 //IPv4
    #define INET_ADDRSTRLEN 46 //IPv6
    返回值:成功返回字符串的首地址,失败返回NULL

    示例:
    ntop.c

    #include "../Head.c"
    int main()
    {
        unsigned char ip[]={172,20,223,75};
        char ip_str[16]="NULL";
    
        inet_ntop(AF_INET,(unsigned int*)ip,ip_str,16);
        printf("ip_str=%s\n",ip_str);
        return 0;
    }
    

    在这里插入图片描述

    展开全文
  • 字节顺序函数: 小端字节序:将低序字节存储在起始地址。(linux) 大端字节序:将高序字节存储在起始地址。(网络字节序) ...下面是四个转换函数(在某些采用大端字节序的系统里面,这四个函数被定位空宏):
  • 转换函数 htonl 、htons 、ntohl 和 ntohs inet_addr 、inet_aton 和 inet_ntoa inet_pton和 inet_ntop 主机字节序网络字节序 现代 CPU 的累加器一次能装载至少 4 字节,即一个整数。那么这 4个 字节在内存中...
  • 字节序转换函数

    千次阅读 2016-04-16 11:18:32
    由于主机的千差万别,主机的字节序不能做到统一,但是对于网络上传输的变量,它们的值必须有一个统一的表示方法。网络字节序是指多字节变量在...Linux系统提供了如下函数进行字节序转换。#include uint32_t htonl
  • htonl: 将long型主机字节序转换网络字节序 htons: 将short型主机字节序转换网络...项目中遇到个问题,使用了htonl函数对short型网络字节序数进行转换,导致程序出错, 以为既然是很小的数字,那么short型和lon
  • IP地址本地字节序转换函数有以下几种: 1、uint32_t htonl(uint32_t hostlong); //一般不用来转换ip地址 这个函数是int转int型,而我们习惯用的ip的是点分十进制的字符串。 用起来不方便,所以,此函数多数用来...
  • linux字节序转换函数和地址转换函数

    千次阅读 2009-11-06 01:40:00
    想想学习linux下的网络编程也不少时间了,这些字节排序和转换函数还是不太清楚,容易混淆。今天索性把这方面的知识汇总一下,争取以后能够熟练的认识和运用。字节顺序函数:小端字节序:将低序字节存储在起始地址...
  • #include unit16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t... //均返回网络字节序的值 unit16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net32bitvalue); //均返回主机字节序的值
  • 最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的...通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换网络字节序,拆包的时候要将网络字节序转换为主机字节序。 原以为还
  • C++ 网络字节顺序转换函数、ip格式转换函数
  • 常用于绑定之前地址结构体的设置,将本机端口转为网络字节序。 (4)ntohs ,h=host,n=network.常用于与对方通信后,在需要使用对方端口的时候,将其中(收到的对方端口为网络字节序)转为主机字节序。 (5)inet_...
  • Part 1: htons函数具体解释 ... 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换网络字节顺序。  在Intel机器下,执行以下程序 int main() ...{  
  • 一般一个16位(双字节)的数据,比如 FF1A(16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低位位,左边是高位 C语言中的高位字节和...
  • (转自:... Part 1: htons函数具体解释 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换网络字节顺序。 在Intel机器下,执行以下程序 int main() { printf("%...
  • 打造自己的字节序转换函数(16位、32位和64位) 分类: c/c++ linux windows2010-12-22 17:05 582人阅读 评论(1) 收藏 举报 在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,...
  • 1、网络字节序:是TCP/IP中一种固定好的数据表示格式,它与具体的CPU,操作系统,传输方式无关,从而可以保证数据在不同主机之间传输时能够兼容。 2、主机字节序:即大端(Big Endian)与小端(Little Endian)模式;由...
  • 64位网络字节序与主机字节序转换

    千次阅读 多人点赞 2017-04-06 08:36:52
    unsigned long long ntohll(unsigned long long val) { if (__BYTE_ORDER == __LITTLE_ENDIAN) { return (((unsigned long long )htonl((int)((val > 32))) > 32)); } else i
  • 在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。不同的处理器所采用的字节序可能是不同的,例如: x86,6502, Z80, VAX,和 PDP-...
  • 引言:在进行网络通信时是否需要进行字节序转换?  相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得第一个字节是高...
  • 网络字节序之间的转换函数详解

    千次阅读 2014-10-05 18:17:43
    接下来介绍两组地址转换函数
  • 在对IP地址结构体SOCKADDR_...查看这些函数的解析,会发现这些函数其实是与主机字节序网络字节序之间转换有关。就是什么网络字节序,什么是主机字节序呢?下面我写出他们之间的转换: 用IP地址127.0.0.1为例: ...
  • Python的socket库提供了将数据在网络字节序和主机字节序之间相互转换函数。有什么作用呢? 在编写低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据。在这种操作中,需要把主机操作系统发出的...
  • 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 430,884
精华内容 172,353
关键字:

网络字节序转换函数