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

    我是一块砖,哪里需要往哪搬。
  • 相关阅读:
    微信小程序 页面跳转navigator与传递参数
    微信小程序 wxml中的属性记录
    iOS 集成极光推送
    ios 后台发送邮件之SKPSMTPMessage的使用
    git 配置忽略文件(忽略UserInterfaceState.xcuserstate,Breakpoints_v2.xcbkptlist)
    iOS 定位功能的实现
    ios 关于状态栏的一些小知识
    ios label上显示特殊字符 % "
    ios 按钮点击无反应
    ios 正则表达式之验证手机号、邮箱、身份证、银行卡
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4246564.html
Copyright © 2011-2022 走看看