zoukankan      html  css  js  c++  java
  • ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)

    我们知道在由于大端机和小端机导致网络字节序和主机序有可能是有差异的,我们可以使用系统的ntohs,ntohl,htons和htonl这些处理函数进行转换,下面是我写的一个关于ntohs在处理小端机字节序转换的函数的简单实现.

    思想大致如下:

    用u_int16_t的2字节16位的整形变量来存储这个整数,首先将第一个字节和该变量进行或运算,运算结果左移八位,于是刚才的第一个字节结果就到了高八位,然后在与第二个字节进行或运算尽可以了
    代码如下:

    u_int16_t convert16(u_char *p)

    {

      u_int16_t tmp = 0;

      tmp |= p[0];

      tmp <<= 8;

      tmp |= p[1]; 

      return tmp;

     }

    这样就可以了。

    由于是为了获取DNS头部中的资源数和附加数据中的数据长度部分而遇到的这个问题顺便简单介绍一下DNS的一些知识:

    DNS报文的首部格式如下:

                          0                                                   15 16                                                     31

    标识ID

    标志

    问题数

    资源记录数

    授权资源记录数

    额外资源记录数

    查询问题

    回答

    授权信息

    额外信息

    如上图的NDS报文,正事由于资源记录数和额外资源记录数是用两字节的16进制表示,才会有我所说的问题,希望对大家有帮助!

    下面这个是可以针对三字节表示长度的一个网络序和主机节序的转换,比如计算三字节表示数据长度的网络字节序时,不过还是要用系统的函数转换好,这里用到了太多乘法,效率会很低。

    int hex2int(uint8_t u8_hex[])
    {
       int len = 0;

      len = u8_hex[0]*16*16*16*16 + u8_hex[1]*16*16 + u8_hex[2];
     
       return len;
    }

    我是一块砖,哪里需要往哪搬。
  • 相关阅读:
    UI:UITableView表视图
    UI:页面传值、单例模式传值、属性传值、NSUserDefaults 数据持久化
    UI:UINavigationController、界面通信
    UI:UIScrollView、UIPageControl
    UI:tomcat(说话小程序)、相框动画、UISgmentcontrol、UISwitch
    UI:触摸事件 与 事件的回应
    UI:转自互联网资料
    UI:MVC设计模式
    OC:copy 与 retain 的区别
    UI:数据持久化
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4246564.html
Copyright © 2011-2022 走看看