ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)
2015-01-24 20:47
537 查看
我们知道在由于大端机和小端机导致网络字节序和主机序有可能是有差异的,我们可以使用系统的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 | 标志 |
问题数 | 资源记录数 |
授权资源记录数 | 额外资源记录数 |
查询问题 | |
回答 | |
授权信息 | |
额外信息 |
下面这个是可以针对三字节表示长度的一个网络序和主机节序的转换,比如计算三字节表示数据长度的网络字节序时,不过还是要用系统的函数转换好,这里用到了太多乘法,效率会很低。
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;
}
相关文章推荐
- ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)
- 将十进制整形数转换成二进制,然后通过字符型输出 自己实现的一个简单的例子
- 简单算法--输出一个整形数任意进制的表示
- 用C语言实现将一个int类型的数的每一个字节转换为8位2进制数的表示!!
- Ubuntu Eclipse C++ UTF-8转换 (UTF-8:3字节表示一个汉字的问题)
- 计算8583报文长度,两个字节表示
- 简单算法 - 两个队列实现一个栈
- Marshal类 两个方法StructureToPtr和PtrToStructure实现序列化 字节 数组 转换
- 用JS 验证输入的值的长度,一个汉字占两个字节
- 字符串转换成16 进制表示
- 用MASM汇编语言实现从10进制/16进制到2进制的转换
- 简单算法 - 用两个栈实现一个队列
- 进制数转换器的VB算法实现(2/8/10/16进制数可以相互转换)
- 数据结构的应用——使用栈实现十进制到其他(2、8、16)进制的转换
- C# 获取字符串长度(一个汉字算两个字节)
- 一个简单的本地化资源管理系统--具体实现
- C++实现的一个简单两个大数相加程序!
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- JS 判断输入字符串的长度(中文占用两个字节,英文占用一个字节)
- C语言简单实现进制互相转换