C/C++如何获取腾讯QQ手机登录QQ可以获取Ip吗窗体上的QQ帐号

android上运行C++代码中的 time(NULL)获取当前时间戳,为什么得到的结果不对
如题,用NDK运行C++代码中time(NULL)函数,得到的结果不对,这是为什么呀??
time_t current_time = time(NULL)*1000;
CLog::Log(LOGDEBUG, "%lld", current_time);
得到很长的一个数字,转化不了标准时间格式。。。
没有更多推荐了,随笔分类 - c/c++
摘要: 原帖地址:http://hi.baidu.com/passionlh/blog/item/bb3adebd3e1e6a.html(1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,J...
怂QQ 阅读(492) |
摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)1.概念在C/C++中,对字符串的操...
怂QQ 阅读(424) |
摘要: 在c++中,null表示:对象为空,它是对指针而言的。而""表示:值为空,它是对字符串而言的。在C++中Null的值为0 在C++中""的值为char '\0' 用otl读mysql的表中的数据时,空值就分为了这两种。只用is_null是无法判断的,解决办法是在sql语句中添加where colName is not null。这样就可以把两种情况都解决掉了。
怂QQ 阅读(1757) |
摘要: c++中 string与string.h 的作用和区别 #include &string.h& void main() {
string aaa= "abcsd d";
printf("looking for abc from abcdecd %s\n", (strcmp(aaa,"abc")) ? "Found" : "Not Found"); } 不能正确执行,提示说是stri...
怂QQ 阅读(211) |
摘要: C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件。文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符。二进制文件把内存中的数据按其在内存中的存储形式原样放入磁盘空间。 二进制文件以及文本文件都可以看做是“数据流”。流文件的特点是,处理时不需考虑文件中的数据的性质、类型和存放格式。访问时只是以字节为单位对...
怂QQ 阅读(7972) |
摘要: C++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。 楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。 关于new[]和delete[],其中又分为两种情况:(1)为基本数据类型分配和回收空间;(2)为自定义类型分配和回收空间。 对于(1),上面提供的程序已经证明了d...
怂QQ 阅读(113) |
摘要: JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c++为了照顾大量的C语言使用者, 而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了c++的固有缺陷。 Java和c...
怂QQ 阅读(129) |
摘要: ################################# ## 基本知识 ## #################################当然我们一切都是从最简单的内建类型开始,最后我会做一些推广。先看一下基本的形式,我们从这里起步!--------------指针----------------int a=10;int *p=&a;-------------指针的指针-...
怂QQ 阅读(169) |
摘要: C++函数模块基础知识:一.问题:强类型语言要求我们为所有希望比较的类型都实现一个实例int min( int a, int b ) {return a & b ? a :}double min( double a, double b ) {return a & b ? a :}有一种方法可替代为每个min()实例都显式定义一个函数的方法这种方法很有吸引力但是也很危险.那就...
怂QQ 阅读(296) |
摘要: 1. struct和class的区别•默认的访问权限不同 class中的成员默认private,struct中的成员默认public•默认的继承权限不同 class默认private继承,struct默认public继承•模板中区别 模板库中,可以使用template&class T& 或template&typename T&,但是没有...
怂QQ 阅读(99) |
摘要: 构造函数:为对象分配存储空间,使一个对象初始化;析构函数:在该对象生命期完结时做相应的扫尾工作并释放由构造函数分配的内存;构造函数不能是虚函数的原因:自己的话:【只有基类指针指向子类对象时,虚函数才用意义。当一个基类指针指向子类对象时,子类对象已经构造好了,已经没有动态绑定的必要了,所以虚函数不能是虚函数。】从概念上来说,如前所述,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信...
怂QQ 阅读(405) |
摘要: 孤立地判定一个语言是弱类型还是强类型是没有意义的,因为在学术界还没有"strongly typed language"的统一的定义。我们只能说语言A相对于语言B是强类型的。笼统地将,强类型语言是能够禁止任何违反类型系统的代码的语言,或者说是能够捕获所有违反类型系统的错误的语言。我们说C++相对于C是强类型的,是因为C++禁止了一些C中的隐式转换,比如将void*转换为任意的指针类型。C语言规定所有...
怂QQ 阅读(752) |
摘要: 以前一直没有明白为什么说new可以动态的分配数组,今天终于搞清楚了。上代码[代码]这样会报错,说数组的参数不是常量。需要改成const int a=5才行。如果使用new就可以动态的定义数组的大小了,不需要常量的参数。[代码]
怂QQ 阅读(86) |
摘要: /*itoa把整型转换成字符串 */itoa(int i, char* string){ int power, j=i; for(power=1; j &= 10; j/=10)
power*=10; for(; power & 0 ; power/=10){*string++ = '0'+i/i%= }*string = '\0';}刚碰到的时候对 ...
怂QQ 阅读(232) |
摘要: c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class MyClass{public:MyClass( int num );}....MyClass obj = ...
怂QQ 阅读(85) |
摘要: 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符也可以重载 ..运算符重载是对已有的运算符赋予多重含义...// 也就是说重载完之后,会根据我们定义的重载函数 自动调用最符合调用的方法使用...比如我们定义的类的重载运算符+. 当我们使用类的对象相加时,会自动调用我们定义的重载...而当我们使用内置的+法运算,比如 int b=5+3; 那么这是还是...
怂QQ 阅读(542) |
摘要: 1.默认构造函数如果没有显示的为类声明构造函数,编译器将生成一个不接受任何参数。也不执行任何操作的默认构造函数。然而你可以创建自己的默认构造函数,它不接受任何参数,但根据需要对对象进行设置。编译器提供的构造函数被称为默认构造函数,但按照惯例,任何不接受参数的构造函数都是默认构造函数。如果你创建了任何构造函数,编译器不会提供构造函数。因此,如果需要一个不接受任何参数的构造函数,切已经创建了其他构造函...
怂QQ 阅读(1199) |
摘要: PrecedenceOperatorDescriptionExampleAssociativity1()[]-&.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-incrementPost-decrement(a + ...
怂QQ 阅读(60) |
摘要: 1. 按位左移"&&"按位左移运算符"&&"的作用是对参与运算的对象按规定的位数进行左移,即对运算对象的机器码左移规定的位。在移位的过程中,高位移出的位舍弃,低位左移后补0. 左移一位相当于该数乘以2,按位左移比乘法运算快得多。2. 按位右移"&&"在移位的过程中,低位移出的位舍弃,高位右移后补0或者补1.如果需要移位的数据室无符号数则补0,是有符号数则补符号位...
怂QQ 阅读(116) |
摘要: int w[2][3],(*pw)[3];pw=w;则下列错误的是a.*(w[0]+2)b.*(pw+1)[2] c..pw[0][0]d.*(pw[1]+2)今天晚上因为这道小题仔细研究了C的多维数组和指向多维数组的指针(归根结底,这两个东西完全一致)上面的题是二维的,当你理解了这个题之后,多维的自然就通了。。。要解决这类的问题,需要深刻理解“*,&,[]”这三个...
怂QQ 阅读(618) |
摘要: 异常,通常是指程序可能检测到的,运行时不正常的情况,例如被0除,数组越界访问,内存耗尽等等。异常处理的语法通常是[代码]关键字try以及它后的大括号中的内容我们称其为try块。简单的说,它包含的是可能会出错的地方(就是我们要检测的地方)。当我们检测到一个错误信息的时候,关键字throw就把这个错误抛出来,抛出来怎么办呢?抛哪去呢?我们的catch关键字就给我们解决掉了这个问题。catch通常用来接...
怂QQ 阅读(278) |
摘要: 四个函数的声明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t nelem, size_t elsize); free(q); //其中q为已经分配的块;四个函数都被包含在stdlib.h函数库内。C语言的标准内存分配函数:malloc,calloc,r...
怂QQ 阅读(803) |
摘要: 1、new 是c++中的操作符,malloc是c 中的一个函数2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。4、new 和 malloc效率比较 ...
怂QQ 阅读(123) |
摘要: 由sizeof()求带有虚函数的类的大小引发的思考,在查看相关资料的过程中看到了陈皓先生的一篇文章《C++ 虚函数表解析》(详情见http://blog.csdn.net/haoel)觉得讲的十分的好,只是看完之后仍对为什么要又为什么可以由父类的指针调用子类的对象的虚函数不解,如这种典型的描述:D//Derive 是Base的子类Base *b1 = &d;//这必须使用父...
怂QQ 阅读(238) |
摘要: 1.面向对象技术的基本概念是什么?对象,类和继承。2.虚函数与多态虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,被称为“覆盖”(override)。多态性是允许你将父对象设置成和它一个或更多的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象以不同的方式运作。简单的说,就是:允许将子类类型的指针赋值给父类类型的指针。多态性在c++中...
怂QQ 阅读(124) |
摘要: C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程 序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。宏不是C/C++
语言的一部分,宏在编译前由预处理器处理。 宏的部分功能在C++
中可以由template、inline、const代替。我认为现在保留在C++中的最大用处是自动代码...
怂QQ 阅读(181) |
摘要: 引自原来在CGD讨论的几点总结:1.public继承被称为类型继承(typeinheritance)。往往反映is-a关系。2.protected继承基类的所有公有成员都成为派生类的protected成员。这意味着它们可以被后来从该类派生的类访问,但不能在层次结构之外被访问。3.private继承被称为实现继承(implementationinheritance)。派生类提供自己的公有接口,重用基...
怂QQ 阅读(261) |
摘要: 1.概念 变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的; 对于每个变量,都有2个值与其相关联: 1&数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(readvalue),文字常量和变量都可被用于右值。 2&地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。 2.问题 给表达式加上括号:++a-- 结果+...
怂QQ 阅读(322) |
摘要: 在标注c++中,数组类是c++标准库的一部分,现在它不叫数组,而叫向量(vector)了。一、vector的几种初始化方式:const int size = 8;const int value = 1024;1.//size=8的vector//每个元素被初始化为0vector&int& vec1( size )2.//size为8//每个元素都被初始化为1024vector&i...
怂QQ 阅读(83) |
摘要: const_iterator:C++为每种容器类型定义了一种名为const_iterator的类型,该类型只能用于读取容器内的元素,但不能改变其值。对const_iterator类型解引用,得到的是一个指向const对象的引用。 for (vector&string&::const_iterator iter = text.begin(); iter != text.end(); ++...
怂QQ 阅读(374) |
摘要: 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。2.进入构造函数后在构造函数中执行一般计算计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认为是赋值,而不是初始化。使用初始化列表有两个原因...
怂QQ 阅读(82) |
摘要: 本文描述了C++中的各种多态性。重点阐述了面向对象的动态多态和基于模板的静态多态,并初步探讨了两种技术的结合使用。 关键词: 多态 继承 虚函数 模板 宏 函数重载 泛型编程 泛型模式 导言 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力&#...
怂QQ 阅读(130) |
摘要: 引言 一直以来都没有写过一篇关于概念性的文章,因为我觉得这些概念性的东西书本上都有并且说的也很详细写来也无用,今天突发奇想想写一写,下面就和大家讨论一下虚基类、虚函数与纯虚函数,一看名字就让人很容易觉得混乱。不过不要紧待看完本文后你就会理解了。正文 虚基类 在说明其作用前先看一段代码classA{public:intiV};classB:publicA{public:voidbPrint...
怂QQ 阅读(128) |
摘要: char a[]="liuj";定义的是一个字符串,字符串后面以'\0'结尾,所以 sizeof(a)=5char b[]={'l','i','u','j'};定义的是一个字符数组,所以sizeof(b)=4在c语言中,字符串和字符数组都可以用a[0],a[1]……来调用其中的某个元素。而在perl中,字符串标量$a="liuj",是无法用下标来访问的。如果一定想访问的话,...
怂QQ 阅读(1514) |
摘要: 研究了好久,笔试的时候还是给打错了。发篇日志纪念一下。事实上这个概念谁都有只是三种声明方式非常相似:Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * ( * 读成 pointer to ) cp is a const pointer to char const char * p is...
怂QQ 阅读(303) |
摘要: C++深拷贝与浅拷贝浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。如果你拷...
怂QQ 阅读(453) |C++中的引用与指针的区别
指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化。
& &&★ 相同点:
& & 1. 都是地址的概念;
& & & &指针指向一块内存,它的内容是所指内存的地址;
& & & &引用是某块内存的别名。
& & ★ 区别:
& & 1. 指针是一个实体,而引用仅是个别名;
& & 2. 引用使用时无需解引用(*),指针需要解引用;
& & 3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
& & & &引用&从一而终& ^_^
& & 4. 引用没有 const,指针有 const,const 的指针不可变;
& & 5. 引用不能为空,指针可以为空;
& & 6. &sizeof 引用&得到的是所指向的变量(对象)的大小,而&sizeof 指针&得到的是指针本身(所指向的变量或对象的地址)的大小;
& & typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。
& & 7. 指针和引用的自增(++)运算意义不一样;
& & ★ 联系
& &&1. 引用在语言内部用指针实现(如何实现?)。
& & 2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。
& & 引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n 是m 的一个引用(reference),m 是被引用物(referent)。
& & int m;
& & int &n = m;
& & n 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作。例如有人名叫王小毛,他的绰号是&三毛&。说&三毛&怎么怎么的,其实就是对王小毛说三道四。所以n 既不是m 的拷贝,也不是指向m 的指针,其实n 就是m 它自己。
& & 引用的一些规则如下:
& & (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
& & (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
& & (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
& & 以下示例程序中,k 被初始化为i 的引用。语句k = j 并不能将k 修改成为j 的引用,只是把k 的值改变成为6.由于k 是i 的引用,所以i 的值也变成了6.
& & int i = 5;
& & int j = 6;
& & int &k = i;
& & k = j; // k 和i 的值都变成了6;
& & 上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
& & 1)以下是&值传递&的示例程序。由于Func1 函数体内的x 是外部变量n 的一份拷贝,改变x 的值不会影响n, 所以n 的值仍然是0.
&&void Func1(int x){x = x + 10;}int n = 0;Func1(n);cout && &n = & && n &&// n = 0
& & 2)以下是&指针传递&的示例程序。由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10.
void Func2(int *x){(* x) = (* x) + 10;}⋯int n = 0;Func2(&n);cout && &n = & && n && // n = 10
& & 3)以下是&引用传递&的示例程序。由于Func3 函数体内的x 是外部变量n 的引用,x和n 是同一个东西,改变x 等于改变n,所以n 的值成为10.
&&void Func3(int &x){x = x + 10;}⋯int n = 0;Func3(n);cout && &n = & && n && // n = 10
& & &对比上述三个示例程序,会发现&引用传递&的性质象&指针传递&,而书写方式象&值传递&。实际上&引用&可以做的任何事情&指针&也都能够做,为什么还要&引用&这东西?
& & 答案是&用适当的工具做恰如其分的工作&。
& & 指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
& & 就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
& & 如果的确只需要借用一下某个对象的&别名&,那么就用&引用&,而不要用&指针&,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
& & &&&&&&&&&&
& & 摘自「高质量c++编程」
& & 指针与引用,在More Effective C++ 的条款一有详细讲述,我给你转过来
& & 条款一:指针与引用的区别
& & 指针与引用看上去完全不同(指针用操作符&*&和&-&&,引用使用操作符&。&),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
& & 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
& & &但是,请等一下&,你怀疑地问,&这样的代码会产生什么样的后果?&
& & char *pc = 0; &// 设置指针为空值
& & char& rc = *pc;// 让引用指向空值
& & 这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
& & 因为引用肯定会指向一个对象,在C++里,引用应被初始化。
&&& string& rs; // 错误,引用必须被初始化
&&& string s("xyzzy");
&&& string& rs = s; // 正确,rs指向s
&&& 指针没有这样的限制。
&&& string *ps; // 未初始化的指针
&&& // 合法但危险
& & 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
void printDouble(const double& rd){&&&& cout && // 不需要测试rd,它} // 肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDouble(const double *pd){&&&& if (pd)
&&&& { // 检查是否为NULL&&&&&&&&&& cout && *&&&& }}
& & 指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
&&string s1("Nancy");string s2("Clancy");string& rs = s1; // rs 引用 s1string *ps = &s1; // ps 指向 s1rs = s2; // rs 仍旧引用s1,// 但是 s1的值现在是// "Clancy"ps = &s2; // ps 现在指向 s2;// s1 没有改变
& & 总的来说,在以下情况下你应该使用指针,
& & 一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),
& & 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
& &&还有一种情况,就是当你重载某个操作符时,你应该使用引用。
& & 最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象,其能被赋值。
&&vector&int& v(10); // 建立整形向量(vector),大小为10;// 向量是一个在标准C库中的一个模板(见条款35)v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值如果操作符[]返回一个指针,那么后一个语句就得这样写:*v[5] = 10;
& & 但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)
& & 当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针假设你有
&void func(int* p, int&r);int a = 1;int b = 1;func(&a,b);
& &指针本身的值(地址值)是以pass by value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,
& & p = someotherpointer; //a is still 1
& & 但能用指针来改变指针所指向的变量的值,
& & *p = 123131; // a now is 123131
& & 但引用本身是以pass by reference进行的,改变其值即改变引用所对应的变量的值
& & r = 1231; // b now is 1231
& &&尽可能使用引用,不得已时使用指针。
& &&当你不需要&重新指向&时,引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面,而指针用于对象内部。
& & 上述的例外情况是函数的参数或返回值需要一个&临界&的引用时。这时通常最好返回/获取一个指针,并使用 NULL 指针来完成这个特殊的使命。(引用应该总是对象的别名,而不是被解除引用的 NULL 指针)。
& & 注意:由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的 C 程序员有时并不喜欢引用。然而,当有了一些 C++ 经验后,你会很快认识到这是信息隐藏的一种形式,它是有益的而不是有害的。就如同,程序员应该针对要解决的问题写代码,而不是机器本身。
阅读(...) 评论()今日不知为何,总有点感慨人生。做了程序猿已经差不多快2年了,除了工作上的软件之外,貌似从来没为自己做过什么实用的软件,比如一些快捷的工具等等。感觉着编程技术在工作上确实很难学到。特别是国内的公司,尽管更新的技术,更优秀的技术诞生了,可我们还是依然用着以前的技术,某些简单的技术,反反复复。很难找到一些挑战性的元素。于是,就找点有意思的事情来做做吧。
腾讯QQ无疑已经是国内即时通讯软件的的巨头了. 相当于国外的MSN。围绕着腾讯QQ的软件也非常多非常多,例如自动回复软件.群发消息软件等等。今天,我们就以腾讯QQ的注册为案列实现一个只需要输入验证码就能注册的C#版软件。
首先我们看看腾讯QQ的注册页面
根据这个页面,我们可以了解到,注册一个QQ的基本元素。 昵称,密码,性别,生日,所在地,验证码(一般第一次打开这个页面时没有验证码),还有立即注册的提交按钮。
在这之前,我们需要这边一个抓包工具来抓取POST包
安装后在IE浏览器的工具里可以找到,如上图所示。具体用法请百度了。这里将不再讲述。
PS:刚刚抓包才发现,我的IE HttpAnalyzer已经过期了。将就用HttpWatch吧。其实用哪个都一样。。
抓包结果如图
我们主要关注POST提交这一段就可以了。如图
图片可能小了。看不清楚,附上文字
下面是提交POST的信息
POST /cgi-bin/chs/numreg/get_acc?r=0.5849 HTTP/1.1 Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 ( MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: zc.qq.com
Content-Length: 487
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: pt2gguin=o; pgv_pvid=; RK=4/CD46/CsN; ptui_loginuin=; uin=o; skey=@qeJO2b28Y; ptisp= pgv_info=ssid=s; o_cookie=; verifysession=ha6d8c92710d21caffecba00a65b840fd02f67123; machineCookie=655f408c98d3968eebf866fa3; zc_uid=_; sessionCookie=a20b4ac684c8fdeca; uoc=0-0-9-0-10-0-0-19; _new_uin=; wdl=57fec8df28eea424ac528a95c55; clientkey=b3c40deb11c9e59c7f7c1fdc2; index_ec=0; nick=sdfsdf
&verifycode=ovur&qzone_flag=1&country=1&province=44&city=3&isnongli=0&year=1995&month=3&day=3&isrunyue=0&password=b0b81bd39cc122dc2389abd9affc5cd44b29c6fae65a82d0dccfad3e70dfbbdaed7d246af698ecb25c7dcf9d553c3a9e9c70b205a8152aebd296d94eecad82edce6d91bf3760acc44e4f71baaeca4bb63d&phone_num=&nick=sdfsdf&email=false&other_email=false&elevel=1&sex=1&qzdate=&jumpfrom=58030&csloginstatus=0&r5d8=w5g8
下面是提交完成后返回的数据
HTTP/1.1 200 OK
Server: QZHTTP-2.12
Date: Thu, 18 Oct :42 GMT
Content-Length: 61
Set-Cookie:_new_uin=; Domain=zc.qq. Path=/
Set-Cookie:sessionCookie=; Domain=zc.qq. Path=/
Set-Cookie:wdl=0341a2fea97c7a0c5; Domain=zc.qq. Expires=Thu, 18 Oct :42 GMT; Path=/; HTTPOnly
Set-Cookie:clientkey=bf972ece0ce242c3d588d7fa22a82773ffc6; Domain=zc.qq. Path=/
Content-Type: text/html
Connection: keep-alive
{"ec":0,"safeverifyResult":"1","type":"0","uin":""}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
分析提交的数据
&verifycode=ovur&qzone_flag=1&country=1&province=44&city=3&isnongli=0&year=1995&month=3&day=3&isrunyue=0&password=b0b81bd39cc122dc2389abd9affc5cd44b29c6fae65a82d0dccfad3e70dfbbdaed7d246af698ecb25c7dcf9d553c3a9e9c70b205a8152aebd296d94eecad82edce6d91bf3760acc44e4f71baaeca4bb63d&phone_num=&nick=sdfsdf&email=false&other_email=false&elevel=1&sex=1&qzdate=&jumpfrom=58030&csloginstatus=0&r5d8=w5g8
verifycode:验证码
qzone_flag:是否开通空间,1代表开通0不开通
&country=1&province=44&city=3&isnongli=0&year=1995&month=3&day=3:这些你们懂的。。
isrunyue=0:不知道什么,估计是一个固定值
password::密码你懂得后面是加密过密码的字符串
&phone_num=&nick=sdfsdf&email=false&other_email=false&elevel=1&sex=1&qzdate=&jumpfrom=58030&csloginstatus=0&r5d8=w5g8:这些就不说了。估计你不知道的参数保持原样,我们只替换知道的参数就行
分析返回的结果
{"ec":0,"safeverifyResult":"1","type":"0","uin":""}
ec:返回的标志代码,初步预测如下:
case 0: 注册成功;
case 1: EMAIL注册成功;
case 2: 验证码错误;
case 4:case 5:case 6: 生日或省份错误;
case 8:case 9: EMAIL错误;
case 13:case 15:昵称错误;
case 20: 需要手机短信验证;
原因:可能是COOKIE错误
case 21: 恶意注册,暂时禁止;
原因:注册的账号过多,或RSA算法错误
case 26: 需要手机激活;
原因:相同IP注册过多或提交的COOKIE已经过期,或SESSION超时
case 30: 浏览器不兼容;
safeverifyResult:验证码通过
type:真心不知
uin:很明显,QQ号码
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接下来我们就是要模拟数据了,在这之前,我们需要获得一些元素
第一:URL分析
地址:【+ 0.161&&&&&&& !&&& 0.019&&& 944&&& 304&&& GET&&& 200&&& html&&& 】
分析:返回结果 -》{"city":"娣卞湷","cityid":"3","country":"涓?浗","countryid":"1","ec":0,"elevel":"1","localdate":"","province":"骞夸笢","provinceid":"44"}
&&&&&&&& utf-8编码之后,就是正常的了。看字面上的意思,我相信你们理解的。
&&&&&&&&& 参数r:随机数,准确的来说是& 0.(+16个随机数)[不写貌似也可能获得]
&&&&&&&& cookiecode:cookie代码,直接忽略吧。不管它
验证码:& 【 0.244&&&&&&& !&&& 0.039&&& 630&&& 2812&&& GET&&& 200&&& jpeg&&& 】
分析:aid是当前的版本,r是随机数
Post地址:【+ 0.000&&&&&&& !&&& 0.166&&& 1459&&& 564&&& POST&&& 200&&& html&&& 】
分析:没什么好说的。
第二:密码分析
根据:password=b0b81bd39cc122dc2389abd9affc5cd44b29c6fae65a82d0dccfad3e70dfbbdaed7d246af698ecb25c7dcf9d553c3a9e9c70b205a8152aebd296d94eecad82edce6d91bf3760acc44e4f71baaeca4bb63d
很明显,经过加密的,到底使用什么加密呢?????
通常,如果是我们写注册模块的话。会把加密文件写在哪里呢???
没错,不用怀疑,就是JS。。。JS。
根据我们的预测,我们来look,look我们抓包的页面的js下载的URL(带上你们的火眼look,look)
相信不用一分钟的实现,你们就发现了 simple.js,rsa.js,index.js 我了个去。够明显吧。 rsa.js&..
预测90%是rsa加密了。
index.js& 做网站的人大部分都知道&这个文件的含义是什么&。很明显,也是90%通过这个文件提交表单数据,然后再这个文件里面条用rsa.js进行加密。
(PS:剩下10%大家去研究吧..仔细看看文件里面的内容)
本人也在研究中&&&&&&&&.
大约看了10分钟的样子,肯定加一定:rsa.js加密
细心的你们肯定还会发现&他是这样调用的。。。
rsaEncrypt:function(a)
var b=new RSAKb.setPublic("C4D23C2DB0ECC904FE0CD0CBBCDC988C039D79E1BDA8ED4BFD4D40D1AD6D0F0EEEF2C4A08DFDFCA3AC1BE71A846E08DD2D9F1CBDDFF40CA00C10C62B1DDC454293BCA9ED4E7D76AA88EFAFBA270A141E7","10001");
return b.encrypt(a)
ok,ok,到这里。我们及知道了rsa.js加密js文件,也知道了调用的方法&那就是说。。密码这一关,过了!!!!
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
万事俱备,只欠东风啊!!!!
分析就此完成,现在开始编码&&&&&.
新建winform程序。。拖点控件啥的就不说了&直接切入主题
第一:准备js
拷贝rsa.js的内容,在后面加个方法,如下:
function parseBigInt(a, b) { return new BigInteger(a, b) } function linebrk(a, b) { for (var c = "", d = 0; d + b & a. ) c += a.substring(d, d + b) + "\n", d += return c + a.substring(d, a.length) } function byte2Hex(a) { return a & 16 ? "0" + a.toString(16) : a.toString(16) }function pkcs1pad2(a, b) { if (b & a.length + 11) return uv_alert("Message too long for RSA"), null; for (var c = [], d = a.length - 1; d &= 0 && b & 0; ) { var e = a.charCodeAt(d--); e & 128 ? c[--b] = e : e & 127 && e & 2048 ? (c[--b] = e & 63 | 128, c[--b] = e && 6 | 192) : (c[--b] = e & 63 | 128, c[--b] = e && 6 & 63 | 128, c[--b] = e && 12 | 224) } c[--b] = 0; d = new SecureR for (e = []; b & 2; ) { for (e[0] = 0; e[0] == 0; ) d.nextBytes(e); c[--b] = e[0] } c[--b] = 2; c[--b] = 0; return new BigInteger(c) } function RSAKey() { this.n = null; this.e = 0; this.coeff = this.dmq1 = this.dmp1 = this.q = this.p = this.d = null }function RSASetPublic(a, b) { a != null && b != null && a.length & 0 && b.length & 0 ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16)) : uv_alert("Invalid RSA public key") } function RSADoPublic(a) { return a.modPowInt(this.e, this.n) } function RSAEncrypt(a) { a = pkcs1pad2(a, this.n.bitLength() + 7 && 3); if (a == null) return null; a = this.doPublic(a); if (a == null) return null; a = a.toString(16); return (a.length & 1) == 0 ? a : "0" + a }RSAKey.prototype.doPublic = RSADoPRSAKey.prototype.setPublic = RSASetPRSAKey.prototype.encrypt = RSAEvar dbits, canary = 590, j_lm = (canary & ) == ; function BigInteger(a, b, c) { a != null && ("number" == typeof a ? this.fromNumber(a, b, c) : b == null && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b)) } function nbi() { return new BigInteger(null) } function am1(a, b, c, d, e, f) { for (; --f &= 0; ) { var g = b * this[a++] + c[d] + e, e = Math.floor(g / ); c[d++] = g &
} return e }function am2(a, b, c, d, e, f) { var g = b & 32767; for (b &&= 15; --f &= 0; ) { var h = this[a] & 32767, i = this[a++] && 15, k = b * h + i * g, h = g * h + ((k & 32767) && 15) + c[d] + (e & ), e = (h &&& 30) + (k &&& 15) + b * i + (e &&& 30); c[d++] = h &
} return e } function am3(a, b, c, d, e, f) { var g = b & 16383; for (b &&= 14; --f &= 0; ) { var h = this[a] & 16383, i = this[a++] && 14, k = b * h + i * g, h = g * h + ((k & 16383) && 14) + c[d] + e, e = (h && 28) + (k && 14) + b * c[d++] = h &
} return e }j_lm = true; BigInteger.prototype.am = am2; dbits = 30; BigInteger.prototype.DB = BigInteger.prototype.DM = (1 && dbits) - 1; BigInteger.prototype.DV = 1 && var BI_FP = 52; BigInteger.prototype.FV = Math.pow(2, BI_FP); BigInteger.prototype.F1 = BI_FP - BigInteger.prototype.F2 = 2 * dbits - BI_FP; var BI_RM = "abcdefghijklmnopqrstuvwxyz", BI_RC = [], rr,rr = "0".charCodeAt(0); for (vv = 0; vv &= 9; ++vv) BI_RC[rr++] = rr = "a".charCodeAt(0); for (vv = 10; vv & 36; ++vv) BI_RC[rr++] = rr = "A".charCodeAt(0); for (vv = 10; vv & 36; ++vv) BI_RC[rr++] = function int2char(a) { return BI_RM.charAt(a) } function intAt(a, b) { var c = BI_RC[a.charCodeAt(b)]; return c == null ? -1 : c } function bnpCopyTo(a) { for (var b = this.t - 1; b &= 0; --b) a[b] = this[b]; a.t = this.t; a.s = this.s } function bnpFromInt(a) { this.t = 1; this.s = a & 0 ? -1 : 0; a & 0 ? this[0] = a : a & -1 ? this[0] = a + DV : this.t = 0 }function nbv(a) { var b = nbi(); b.fromInt(a); return b }function bnpFromString(a, b) {
var if (b == 16) c = 4; else if (b == 8) c = 3; else if (b == 256) c = 8; else if (b == 2) c = 1; else if (b == 32) c = 5; else if (b == 4) c = 2; else { this.fromRadix(a, b); return } this.s = this.t = 0; for (var d = a.length, e = false, f = 0; --d &= 0; ) { var g = c == 8 ? a[d] & 255 : intAt(a, d); g & 0 ? a.charAt(d) == "-" && (e = true) : (e = false, f == 0 ? this[this.t++] = g : f + c & this.DB ? (this[this.t - 1] |= (g & (1 && this.DB - f) - 1) && f, this[this.t++] = g && this.DB - f) : this[this.t - 1] |= g && f, f += c, f &= this.DB && (f -= this.DB)) } if (c == 8 && (a[0] & 128) != 0) this.s = -1, f & 0 && (this[this.t -1] |= (1 && this.DB - f) - 1 && f); this.clamp(); e && BigInteger.ZERO.subTo(this, this)} function bnpClamp() { for (var a = this.s & this.DM; this.t & 0 && this[this.t - 1] == ) --this.t }function bnToString(a) { if (this.s & 0) return "-" + this.negate().toString(a); if (a == 16) a = 4; else if (a == 8) a = 3; else if (a == 2) a = 1; else if (a == 32) a = 5; else if (a == 4) a = 2; else return this.toRadix(a); var b = (1 && a) - 1, c, d = false, e = "", f = this.t, g = this.DB - f * this.DB % if (f-- & 0) { if (g & this.DB && (c = this[f] && g) & 0) d = true, e = int2char(c); for (; f &= 0; ) g & a ? (c = (this[f] & (1 && g) - 1) && a - g, c |= this[--f] && (g += this.DB - a)) : (c = this[f] && (g -= a) & b, g &= 0 && (g += this.DB, --f)), c & 0 && (d = true), d && (e += int2char(c)) } return d ? e : "0" }function bnNegate() { var a = nbi(); BigInteger.ZERO.subTo(this, a); return a } function bnAbs() { return this.s & 0 ? this.negate() : this } function bnCompareTo(a) { var b = this.s - a.s; if (b != 0) return var c = this.t, b = c - a.t; if (b != 0) return for (; --c &= 0; ) if ((b = this[c] - a[c]) != 0) return return 0 } function nbits(a) { var b = 1, if ((c = a &&& 16) != 0) a = c, b += 16; if ((c = a && 8) != 0) a = c, b += 8; if ((c = a && 4) != 0) a = c, b += 4; if ((c = a && 2) != 0) a = c, b += 2; a && 1 != 0 && (b += 1); return b }function bnBitLength() { return this.t &= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM) } function bnpDLShiftTo(a, b) { var for (c = this.t - 1; c &= 0; --c) b[c + a] = this[c]; for (c = a - 1; c &= 0; --c) b[c] = 0; b.t = this.t + b.s = this.s } function bnpDRShiftTo(a, b) { for (var c = c & this.t; ++c) b[c - a] = this[c]; b.t = Math.max(this.t - a, 0); b.s = this.s }function bnpLShiftTo(a, b) { var c = a % this.DB, d = this.DB - c, e = (1 && d) - 1, f = Math.floor(a / this.DB), g = this.s && c & this.DM, for (h = this.t - 1; h &= 0; --h) b[h + f + 1] = this[h] && d | g, g = (this[h] & e) && for (h = f - 1; h &= 0; --h) b[h] = 0; b[f] = b.t = this.t + f + 1; b.s = this.s; b.clamp() }function bnpRShiftTo(a, b) { b.s = this.s; var c = Math.floor(a / this.DB); if (c &= this.t) b.t = 0; else { var d = a % this.DB, e = this.DB - d, f = (1 && d) - 1; b[0] = this[c] && for (var g = c + 1; g & this.t; ++g) b[g - c - 1] |= (this[g] & f) && e, b[g - c] = this[g] && d & 0 && (b[this.t - c - 1] |= (this.s & f) && e); b.t = this.t - b.clamp() } }function bnpSubTo(a, b) { for (var c = 0, d = 0, e = Math.min(a.t, this.t); c & ) d += this[c] - a[c], b[c++] = d & this.DM, d &&= this.DB; if (a.t & this.t) { for (d -= a.s; c & this.t; ) d += this[c], b[c++] = d & this.DM, d &&= this.DB; d += this.s } else { for (d += this.s; c & a.t; ) d -= a[c], b[c++] = d & this.DM, d &&= this.DB; d -= a.s } b.s = d & 0 ? -1 : 0; d & -1 ? b[c++] = this.DV + d : d & 0 && (b[c++] = d); b.t = b.clamp() }function bnpMultiplyTo(a, b) { var c = this.abs(), d = a.abs(), e = c.t; for (b.t = e + d.t; --e &= 0; ) b[e] = 0; for (e = 0; e & d.t; ++e) b[e + c.t] = c.am(0, d[e], b, e, 0, c.t); b.s = 0; b.clamp(); this.s != a.s && BigInteger.ZERO.subTo(b, b) } function bnpSquareTo(a) { for (var b = this.abs(), c = a.t = 2 * b.t; --c &= 0; ) a[c] = 0; for (c = 0; c & b.t - 1; ++c) { var d = b.am(c, b[c], a, 2 * c, 0, 1); if ((a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) &= b.DV) a[c + b.t] -= b.DV, a[c + b.t + 1] = 1 } a.t & 0 && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1)); a.s = 0; a.clamp() }function bnpDivRemTo(a, b, c) {
var d = a.abs(); if (!(d.t &= 0)) {
var e = this.abs(); if (e.t & d.t) b != null && b.fromInt(0), c != null && this.copyTo(c); else {
c == null && (c = nbi()); var f = nbi(), g = this.s, a = a.s, h = this.DB - nbits(d[d.t - 1]); h & 0 ? (d.lShiftTo(h, f), e.lShiftTo(h, c)) : (d.copyTo(f), e.copyTo(c)); d = f.t; e = f[d - 1]; if (e != 0) {
var i = e * (1 && this.F1) + (d & 1 ? f[d - 2] && this.F2 : 0), k = this.FV / i, i = (1 && this.F1) / i, o = 1 && this.F2, l = c.t, m = l - d, j = b == null ? nbi() : f.dlShiftTo(m, j); c.compareTo(j) &= 0 && (c[c.t++] = 1, c.subTo(j, c)); BigInteger.ONE.dlShiftTo(d,j); for (j.subTo(f, f); f.t & ) f[f.t++] = 0; for (; --m &= 0; ) { var n = c[--l] == e ? this.DM : Math.floor(c[l] * k + (c[l - 1] + o) * i); if ((c[l] += f.am(0, n, c, m, 0, d)) & n) { f.dlShiftTo(m, j); for (c.subTo(j, c); c[l] & --n; ) c.subTo(j, c) } } b != null && (c.drShiftTo(d, b), g != a && BigInteger.ZERO.subTo(b, b)); c.t = c.clamp(); h & 0 && c.rShiftTo(h, c); g & 0 && BigInteger.ZERO.subTo(c, c)
} } function bnMod(a) { var b = nbi(); this.abs().divRemTo(a, null, b); this.s & 0 && b.compareTo(BigInteger.ZERO) & 0 && a.subTo(b, b); return b } function Classic(a) { this.m = a }function cConvert(a) { return a.s & 0 || a.compareTo(this.m) &= 0 ? a.mod(this.m) : a } function cRevert(a) { return a } function cReduce(a) { a.divRemTo(this.m, null, a) } function cMulTo(a, b, c) { a.multiplyTo(b, c); this.reduce(c) } function cSqrTo(a, b) { a.squareTo(b); this.reduce(b) } Classic.prototype.convert = cC Classic.prototype.revert = cR Classic.prototype.reduce = cR Classic.prototype.mulTo = cMulTo; Classic.prototype.sqrTo = cSqrTo;function bnpInvDigit() { if (this.t & 1) return 0; var a = this[0]; if ((a & 1) == 0) return 0; var b = a & 3, b = b * (2 - (a & 15) * b) & 15, b = b * (2 - (a & 255) * b) & 255, b = b * (2 - ((a & 65535) * b & 65535)) & 65535, b = b * (2 - a * b % this.DV) % this.DV; return b & 0 ? this.DV - b : -b } function Montgomery(a) { this.m = this.mp = a.invDigit(); this.mpl = this.mp & 32767; this.mph = this.mp && 15; this.um = (1 && a.DB - 15) - 1; this.mt2 = 2 * a.t }function montConvert(a) { var b = nbi(); a.abs().dlShiftTo(this.m.t, b); b.divRemTo(this.m, null, b); a.s & 0 && b.compareTo(BigInteger.ZERO) & 0 && this.m.subTo(b, b); return b } function montRevert(a) { var b = nbi(); a.copyTo(b); this.reduce(b); return b }function montReduce(a) { for (; a.t &= this.mt2; ) a[a.t++] = 0; for (var b = 0; b & this.m.t; ++b) { var c = a[b] & 32767, d = c * this.mpl + ((c * this.mph + (a[b] && 15) * this.mpl & this.um) && 15) & a.DM, c = b + this.m.t; for (a[c] += this.m.am(0, d, a, b, 0, this.m.t); a[c] &= a.DV; ) a[c] -= a.DV, a[++c]++ } a.clamp(); a.drShiftTo(this.m.t, a); a.compareTo(this.m) &= 0 && a.subTo(this.m, a) } function montSqrTo(a, b) { a.squareTo(b); this.reduce(b) } function montMulTo(a, b, c) { a.multiplyTo(b, c); this.reduce(c) } Montgomery.prototype.convert = montCMontgomery.prototype.revert = montR Montgomery.prototype.reduce = montR Montgomery.prototype.mulTo = montMulTo; Montgomery.prototype.sqrTo = montSqrTo; function bnpIsEven() { return (this.t & 0 ? this[0] & 1 : this.s) == 0 } function bnpExp(a, b) { if (a &
|| a & 1) return BigInteger.ONE; var c = nbi(), d = nbi(), e = b.convert(this), f = nbits(a) - 1; for (e.copyTo(c); --f &= 0; ) if (b.sqrTo(c, d), (a & 1 && f) & 0) b.mulTo(d, e, c); else var g = c, c = d, d = return b.revert(c) }function bnModPowInt(a, b) { var c = a & 256 || b.isEven() ? new Classic(b) : new Montgomery(b); return this.exp(a, c) } BigInteger.prototype.copyTo = bnpCopyTo; BigInteger.prototype.fromInt = bnpFromI BigInteger.prototype.fromString = bnpFromS BigInteger.prototype.clamp = bnpC BigInteger.prototype.dlShiftTo = bnpDLShiftTo; BigInteger.prototype.drShiftTo = bnpDRShiftTo; BigInteger.prototype.lShiftTo = bnpLShiftTo; BigInteger.prototype.rShiftTo = bnpRShiftTo; BigInteger.prototype.subTo = bnpSubTo;BigInteger.prototype.multiplyTo = bnpMultiplyTo; BigInteger.prototype.squareTo = bnpSquareTo; BigInteger.prototype.divRemTo = bnpDivRemTo; BigInteger.prototype.invDigit = bnpInvD BigInteger.prototype.isEven = bnpIsE BigInteger.prototype.exp = bnpE BigInteger.prototype.toString = bnToS BigInteger.prototype.negate = bnN BigInteger.prototype.abs = bnA BigInteger.prototype.compareTo = bnCompareTo; BigInteger.prototype.bitLength = bnBitL BigInteger.prototype.mod = bnM BigInteger.prototype.modPowInt = bnModPowIBigInteger.ZERO = nbv(0); BigInteger.ONE = nbv(1); var rng_state, rng_pool, rng_ function rng_seed_int(a) { rng_pool[rng_pptr++] ^= a & 255; rng_pool[rng_pptr++] ^= a && 8 & 255; rng_pool[rng_pptr++] ^= a && 16 & 255; rng_pool[rng_pptr++] ^= a && 24 & 255; rng_pptr &= rng_psize && (rng_pptr -= rng_psize) } function rng_seed_time() { rng_seed_int((new Date).getTime()) } if (rng_pool == null) { rng_pool = []; rng_pptr = 0; var for (; rng_pptr & rng_ ) t = Math.floor(65536 * Math.random()), rng_pool[rng_pptr++] = t &&& 8, rng_pool[rng_pptr++] = t & 255; rng_pptr = 0; rng_seed_time() }function rng_get_byte() { if (rng_state == null) { rng_seed_time(); rng_state = prng_newstate(); rng_state.init(rng_pool); for (rng_pptr = 0; rng_pptr & rng_pool. ++rng_pptr) rng_pool[rng_pptr] = 0; rng_pptr = 0 } return rng_state.next() } function rng_get_bytes(a) { var for (b = 0; b & a. ++b) a[b] = rng_get_byte() } function SecureRandom() { } SecureRandom.prototype.nextBytes = rng_get_ function Arcfour() { this.j = this.i = 0; this.S = [] }function ARC4init(a) { var b, c, for (b = 0; b & 256; ++b) this.S[b] = for (b = c = 0; b & 256; ++b) c = c + this.S[b] + a[b % a.length] & 255, d = this.S[b], this.S[b] = this.S[c], this.S[c] = this.j = this.i = 0 } function ARC4next() { var this.i = this.i + 1 & 255; this.j = this.j + this.S[this.i] & 255; a = this.S[this.i]; this.S[this.i] = this.S[this.j]; this.S[this.j] = return this.S[a + this.S[this.i] & 255] } Arcfour.prototype.init = ARC4 Arcfour.prototype.next = ARC4 function prng_newstate() { return new Arcfour } var rng_psize = 256;
function rs(a) { var b = new RSAK b.setPublic("C4D23C2DB0ECC904FE0CD0CBBCDC988C039D79E1BDA8ED4BFD4D40D1AD6D0F0EEEF2C4A08DFDFCA3AC1BE71A846E08DD2D9F1CBDDFF40CA00C10C62B1DDC454293BCA9ED4E7D76AA88EFAFBA270A141E7", "10001"); return b.encrypt(a) }
要想在winform中调用js&.需要安装控件
【Microsoft Script Control 】/Winform 调用js
不懂怎么操作的,&
提示一下:
引用的文件要把嵌入互操作类型设为false
第二:准备HttpHelper类
核心代码页贴出来吧,如下。。。(别人写的)
using System.Collections.G
using System.T
using System.N
using System.IO;
using System.D
using System.Text.RegularE
namespace WindowsFormsRs
public class HttpHelper
private CookieC
public CookieContainer CC
this.cc = value;
public HttpHelper()
this.cc = new CookieContainer();
public HttpHelper(CookieContainer cc)
///&summary&
/// 使用post方式访问目标网页,返回stream二进制流
///&/summary&
public Stream PostAndGetStream(string targetURL, string formData, string contentType, string referer, bool allowAutoRedirect)
//数据编码
ASCIIEncoding encoding = new ASCIIEncoding();
//UTF8Encoding encoding = new UTF8Encoding();
byte[] data = encoding.GetBytes(formData);
//请求目标网页
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetURL);
request.CookieContainer =
request.Method = "POST";
//使用post方式发送数据
request.ContentType = "application/x-www-form-urlencoded";
request.Referer =
request.AllowAutoRedirect = allowAutoR
request.ContentLength = data.L
request.UserAgent = "Mozilla/4.0 ( MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
//request.UnsafeAuthenticatedConnectionSharing =
//模拟一个UserAgent
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
//获取网页响应结果
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cc.Add(response.Cookies);
Stream stream = response.GetResponseStream();
///&summary&
/// 使用post方式访问目标网页,返回字节数组
///&/summary&
public byte[] PostAndGetByte(string targetURL, string formData, string contentType, string referer, bool allowAutoRedirect)
Stream stream = PostAndGetStream(targetURL, formData, contentType, referer, allowAutoRedirect);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
///&summary&
/// 使用post方式访问目标网页,返回图片
///&/summary&
public Image PostAndGetBitmap(string targetURL, string formData, string contentType, string referer, bool allowAutoRedirect)
Stream stream = PostAndGetStream(targetURL, formData, contentType, referer, allowAutoRedirect);
Image image = Image.FromStream(stream);
///&summary&
/// 使用post方式访问目标网页,返回文件
///&/summary&
public void PostAndGetBitmap(string targetURL, string formData, string contentType, string referer, bool allowAutoRedirect,string fileName)
byte[] bytes = PostAndGetByte(targetURL, formData, contentType, referer, allowAutoRedirect);
FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();
///&summary&
/// 使用post方式访问目标网页,返回html页面
///&/summary&
public string PostAndGetHtml(string targetURL, string formData, string contentType, string referer, bool allowAutoRedirect, Encoding encoding)
Stream stream = PostAndGetStream(targetURL, formData, contentType, referer, allowAutoRedirect);
string html = new StreamReader(stream, encoding).ReadToEnd();
///&summary&
/// 使用get方式访问目标网页,返回stream二进制流
///&/summary&
public Stream GetAndGetStream(string targetURL, string contentType, string referer, bool allowAutoRedirect)
//请求目标网页
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetURL);
request.CookieContainer =
request.Method = "GET";
//使用get方式发送数据
request.ContentType = contentT
request.Referer =
request.AllowAutoRedirect = allowAutoR
request.UserAgent = "Mozilla/4.0 ( MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
//获取网页响应结果
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cc.Add(response.Cookies);
Stream stream = response.GetResponseStream();
///&summary&
/// 使用get方式访问目标网页,返回字节数组
///&/summary&
public byte[] GetAndGetByte(string targetURL, string contentType, string referer, bool allowAutoRedirect)
Stream stream = GetAndGetStream(targetURL, contentType, referer, allowAutoRedirect);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
///&summary&
/// 使用get方式访问目标网页,返回图片
///&/summary&
public Image GetAndGetBitmap(string targetURL, string contentType, string referer, bool allowAutoRedirect)
Stream stream = GetAndGetStream(targetURL, contentType, referer, true);
Image image = Image.FromStream(stream);
///&summary&
/// 使用get方式访问目标网页,返回文件
///&/summary&
public void GetAndGetFile(string targetURL, string contentType, string referer, bool allowAutoRedirect, string fileName)
byte[] bytes = GetAndGetByte(targetURL, contentType, referer, allowAutoRedirect);
FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();
///&summary&
/// 使用get方式访问目标网页,返回html页面
///&/summary&
public string GetAndGetHtml(string targetURL, string contentType, string referer, bool allowAutoRedirect, Encoding encoding)
Stream stream = GetAndGetStream(targetURL, contentType, referer, allowAutoRedirect);
string html = new StreamReader(stream, encoding).ReadToEnd();
第三:编写代码开始
private static HttpHelper httpHelper = new HttpHelper();
/// &summary&
/// 得到第一次加密后的密码
/// &/summary&
/// &param name="jsFilePath"&js文件&/param&
/// &param name="funcName"&加密的方法名&/param&
/// &param name="paramers"&加密方法需要传进的参数(一个是密码,另一个是页面上可获取的一个标志码)&/param&
/// &returns&加密过后的密码&/returns&
public static object GetRSAPassword(string jsFilePath, string funcName, params object[] paramers)
StreamReader reader = new StreamReader(jsFilePath);
string sScript = reader.ReadToEnd();
ScriptEngine se = new ScriptEngine(ScriptLanguage.JavaScript);
object obj = se.Run(funcName, paramers, sScript);
//"nick=" + name+ "&isnongli=0&isrunyue=0&appid=9&year=" + year + "&month=" + month + "&day=" + day + "&sex=" + sex+"&elevel=1&password=" + GetRSAPassword(password) + "&verifycode=" +
public static string RegisterQQNum(string name, string rsapassword, string sex, string year, string month, string day, string code)
UTF8Encoding utf8 = new UTF8Encoding();
Byte[] encodedBytes = utf8.GetBytes(name);//编码
name = System.Text.Encoding.UTF8.GetString(encodedBytes, 0, (int)encodedBytes.Length);
string registerURL = "http://zc.qq.com/cgi-bin/iframe/numreg/get_acc_9";
string postData = string.Format("nick={0}&isnongli=0&isrunyue=0&appid=9&year={1}&month={2}&day={3}&sex={4}&elevel=1&password={5}&verifycode={6}", "aaaaabbbb", year, month, day, sex, rsapassword, code);
Debug.WriteLine(postData);
// httpHelper.CC = new System.Net.CookieContainer();
string html = httpHelper.PostAndGetHtml(registerURL, postData, null, null, false, Encoding.UTF8);
//string html= htlp.GetHtml(registerURL, postData, Encoding.UTF8);
public static string GetRandrom()
Random rand = new Random();
string strNum = "";
int i = 0;
while (i&16)
int randomNum = rand.Next(0,10);
strNum += randomNum.ToString();
strNum = "0." + strN
return strN
public static Image GetCode()
string path = "http://captcha.qq.com/getimage?aid=1007901&"+GetRandrom();
Image image= httpHelper.GetAndGetBitmap(path, null, null, false);
public static string GetAddress()
string path = "http://zc.qq.com/cgi-bin/iframe/numreg/init_9?id="+ GetRandrom();
string html= httpHelper.GetAndGetHtml(path, null, null, true, Encoding.UTF8);
以上是我编写的代码 .& 调用而已&没啥啥技术含量滴。。
注册的参数删掉了很多,可以吧不必要的删掉。但是需要谨慎操作啊&!!!
Winform界面代码:(上图,总有动手写几行代码哦,亲&)
界面效果如下:
--------------------------------------------运行中,下图返回---------------------------------------
ok,注册成功
大功告成 !!!
HttpHelper要小小修改一下,腾讯QQ在POST提交的时候要把获取验证码的cookie一并提交上去
但是这个HttpHelper没有把获取图片的Cookie赋值到POST Cookie.
所以要把CC=cc的代码写入.
-----------------------------------------------------------------------------------------------------
申明,本文只做教学指导只用,切勿干坏事!!!
如有疑问请回复本文章
阅读(...) 评论()

我要回帖

更多关于 QQ 获取位置不成功 的文章

 

随机推荐