strtoul函数功能讲解与实现
来源:互联网 发布:个人简历免费下载软件 编辑:程序博客网 时间:2024/06/08 10:46
strtoul()这个函数在驱动程序编写和内核漏洞exploit中经常会遇到。其函数原型如下:
unsigned long strtoul(const char *nptr,char **endptr,int base )
参数1:字符串起始地址
参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
4返回result。
测试代码:
10
9
123
10
3
35
4 如果base=n(1<n<=36),为什么可取到36,很简单,10个数字+26个字母=36。
5 如果base=1时呢? 经测试出现调试错误,也很简单,你听过1进制数吗?!。
unsigned long strtoul(const char *nptr,char **endptr,int base )
参数1:字符串起始地址
参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详细阐述。
贴上函数原型
#define strtoul simple_strtoul #define TOLOWER(x) ((x) | 0x20) //在是字母的情况下,大写转小写 static unsigned int simple_guess_base(const char *cp) { if (cp[0] == '0') { if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2])) return 16; else return 8; } else { return 10; } } unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = 0; if (!base) base = simple_guess_base(cp); if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x') cp += 2; while (isxdigit(*cp)) { unsigned int value; value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10; if (value >= base) break; result = result * base + value; cp++; } if (endp) *endp = (char *)cp; return result; }
函数分析:
1 simple_strtoul()函数里的第一个if语句,如果base=0,自动对字符串里的数字格式进行分析,并返回基数,其值可取8、16、10。第二个if语句,进一步对16进制数处理,是cp指向第三个字符。
2 while循环条件:判断是否为可处理的字符,其处理范围为‘0’-‘9’,‘a’-‘f,‘A'-'F'。
循环体内:如果*cp为数字则value=*cp-'0';如果*cp为字符value=*cp-’a‘+10。
判断value的值,如果value>=base,表明其值超过了基数,是一个不合法的数字,跳出循环。例如基数base=3, 数码符号为0,1,2,3。 此时value=4时就不是一个数码符号。
4返回result。
测试代码:
#include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { unsigned int num1,num2,num3 ,num4,num5,num6 ; char *stop_at =NULL ; char temp1[16] = "0xa" ; char temp2[16] = "011" ; char temp3[16] = "123" ; char temp4[16] = "0xa" ; char temp5[16] = "11" ; char temp6[16] = "Z" ; //if base==0 num1=strtol(temp1,&stop_at,0); num2=strtol(temp2,&stop_at,0); num3=strtol(temp3,&stop_at,0); //if base>1 && base <=32 num4=strtol(temp4,&stop_at,16); num5=strtol(temp5,&stop_at,2); num6=strtol(temp6,&stop_at,36); cout<<num1<<endl; cout<<num2<<endl; cout<<num3<<endl; cout<<num4<<endl; cout<<num5<<endl; cout<<num6<<endl; return 0; }测试结果:
10
9
123
10
3
35
注意:
1 如果字符串以非数字开始,返回值0。
2 基数表示把字符串里的数字当做base进制处理,输出的结果把base进制转换成了10进制。
4 如果base=n(1<n<=36),为什么可取到36,很简单,10个数字+26个字母=36。
5 如果base=1时呢? 经测试出现调试错误,也很简单,你听过1进制数吗?!。
6 尾指针指向字符串有效数字的结束地址。
0 0
- strtoul函数功能讲解与实现
- strtoul() 函数
- strtoul ()函数
- strtoul函数
- strtoul函数
- strtoul 函数
- strtoul函数简介
- strtoul函数简介
- strtoul函数的学习
- 二十三 strtoul函数
- strtoul函数的使用
- strtoul函数的使用
- strtoul函数的使用
- strtoul字符串转换函数
- strtoul 函数解析
- strtoul函数应用
- strtoul函数注意点
- strtoul, strtol实现代码
- ORA-00604和ORA-04031导致数据库实例宕机
- flash
- 【Java并发编程】之十七:深入Java内存模型—内存操作规则总结
- JDK,JRE,JVM区别与联系
- Android的各种Drawable讲解
- strtoul函数功能讲解与实现
- MFC 下自定义消息中获取 Tab Control的子对话框的 句柄
- POJ3764 The xor-longest Path(字典树)
- 渣硕的校招求职经历
- MyBatis3和Spring4基于接口编程的例子
- 仿支付宝“数字增长动画”
- Android-->RatingBar自定义大小,自定义样式(图片)
- Android初识-JSON字符串解析详解
- 打造开发神器—Android Studio上的常用5个插件介绍