zoukankan      html  css  js  c++  java
  • 字节排序函数

    考虑一个16位整数,它由2个字节组成。内存中存储这2个字节有2种方法:

    一种是将低序字节存储在起始地址,称为小端(little-endian)字节序

    另一种方法是将高序字节存储在起始地址,称为大端(big-endian)字节序

    我们把系统所采用的字节序称为主机自己序(host byte order)

    #include	"unp.h"
    
    int
    main(int argc, char **argv)
    {
    	union {
    	  short  s;
              char   c[sizeof(short)];
        } un;
    
    	un.s = 0x0102;
    	printf("%s: ", CPU_VENDOR_OS);
    	if (sizeof(short) == 2) {
    		if (un.c[0] == 1 && un.c[1] == 2)
    			printf("big-endian
    ");
    		else if (un.c[0] == 2 && un.c[1] == 1)
    			printf("little-endian
    ");
    		else
    			printf("unknown
    ");
    	} else
    		printf("sizeof(short) = %d
    ", sizeof(short));
    
    	exit(0);
    }
    

    当一个短整数变量中存放2个字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以此确定字节序

    字符串CPU_VENDOR_OS标识CPU类型、厂家和操作系统版本

    既然网络协议必须指定一个网络字节序(network byte order),作为网络编程人员必须清楚不同字节序的差异

    网际协议使用大端字节序来传送这些多字节整数

    主机字节序和网络字节序的转换:

    h:host

    n:network

    s:short

    l:long

    返回网络字节序的函数:

    uint16_t htons(uint16_t host16bitvalue);

    uint32_t htonl(uint32_t host32bitvalue);

    返回主机字节序的函数:

    uint16_t ntohs(uint16_t net16bitvalue);

    uint32_t ntohl(uint32_t net32bitvalue);

    因特网标准中另一个重要的约定就是位序

    最左边的位是最早出现的最高有效位

    注意位序的编号是从0开始的,分配给最高有效位的编号是0

    ========================if i have some wrong, please give me a message, thx.========================
  • 相关阅读:
    hbase二级索引学习
    redis-cluster集群Mac部署
    http-flume-kafka.conf
    linux 替换文件中的字符串
    flumeDemo
    redis_exporter监控安装
    Hbase内存磁盘大致关系
    spring cloud 尚硅谷学习
    C10K问题
    navicat 远程链接Mysql问题
  • 原文地址:https://www.cnblogs.com/ailx10/p/5347464.html
Copyright © 2011-2022 走看看