ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)
2016-07-08 09:52
417 查看
我们知道在由于大端机和小端机导致网络字节序和主机序有可能是有差异的,我们可以使用系统的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
如上图的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;
}
思想大致如下:
用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;
}
相关文章推荐
- ios检测网络状态改变
- http://www.cnblogs.com/AloneSword/p/3370462.html
- BP神经网络
- 网络编程小知识
- tcpdump
- Linux基础网络设置
- 笔记之Python网络数据采集
- android监听网络状态的广播
- 从tcp原理角度理解Broken pipe和Connection reset by peer的区别
- HTTP 内容协商 accept
- tcpdump: no suitable device found
- Python案例-网络编程-socket入门-server&client
- APP开发流程实例讲解-儒释道网络电台八天开发全程-界面美化并进一步优化排错
- 网页中的三种地址详解
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系
- 用黑暗森林模型理解TCP的三次握手
- Android TCP协议与UDP协议的实现
- 网络中数据传输过程的分析
- 做一名优秀的网络编辑
- HttpClient4.5.2 使用cookie保持会话——获取cookie之后如何传递它(2)