鸡肋

1. 整型转字符串,定长格式化16进制:

如:0X10 --> 0X00000010

1 sprintf(szData, "0x%08x", dwData);//注意中间的0,长度不足,用0填充

 

2. 字符串转整型

如:"1001" --> 9

1 int nDec =strtoul(szBin, NULL, 10);//10为进制,将字符串的内容转换为10进制整型。

 

3. STL常用容器简介

vector<T>:可自动增加容量的数组,使用连续的内存空间。支持[ ]操作符和vector.at( ),只能在vector的最后进行push、pop。

list<T>:双向链表,不使用连续的内存空间。不支持[ ]操作符和vector.at( ),可以很方便的在内部插入和删除,可以在两端进行push、pop。

deque<T>:双向队列,使用连续的内存空间,在功能上合并了vector和list。支持[ ]操作符和vector.at( ),可以很方便的在内部插入和删除,可以在两端进行push、pop。

map<K, T>:关联容器,map的数据结构采用红黑树实现,插入键的元素不允许重复,比较函数只对元素的键进行比较。

 

4. 调整寄存器,使其指向的内存为可写内存

如:调整 ESI 指向的内存为可写内存,可以利用类似的指令如:

1 push esp
2 pop esi
3 retn

但这些指令不是很好找,这里介绍一种变通的方法:

(1)找到 pop eax retn 指令,并让程序转入改位置执行。

(2)找到一条 pop esi retn 的指令,并保证在执行(1)中 pop eax 时它的地址位于栈顶,这样就可以把该地址放在eax中。

(3)找到 push esp jmp eax 指令,并转入执行。

栈布局:

 EBP + 4 [ POP EAX RETN ]          //函数返回地址位置,执行 RETN 指令 
 EBP + 8  [ POP ESI RETN ]
 EBP + C  [ PUSH ESP JMP EAX ]

 

 

 

 

5. C语言,输出BSTR

1 BSTR strTmp = SysAllocString(L"Hello World!");
2 wprintf(L"GetString : %s\r\n", strTmp);            //注意字符串前面的L
3 SysFreeString(strTmp);

 

posted @ 2014-07-27 00:03  luzhiyuan  阅读(266)  评论(0编辑  收藏  举报