摘要:
1. 场景 假设有如下的场景: 卖pizza的, 可以有很多种pizza(CheesePizza, GreekPizza, PepperoniPizza),我们该如何处理它呢,当然我们可以声明一个类,类中创建每一个种类的pizza。但是这样有什么问题吗?我们没有把需要改变的部分剥离出来。软件设计的一个原则就是“是易于扩充而不是修改”,另一个是“对接口编程而不是对实现编程”。 这里就轮到工厂模式出手了。 工厂模式有三种:简单工厂抽象工厂工厂方法2. 简单工厂模式 1.1 Uml 1.2 源代码 1 class Pizza 2 { 3 public: 4 Pizza(){}; 5 virtual 阅读全文
摘要:
想象一下有如下的场景: 有两种主咖啡, 可以搭配任意的饮料,我们的目标是允许类容易扩展,在不修改现有代码的情况下,可以搭配新的行为。这里可以用装饰者模式来实现。1. uml 图 装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 这里吹一下装饰者模式的好处:每个组件都可以单独使用,或者被装饰者包装起来使用装饰者可以扩展组件的状态装饰可以加上新的方法可以为组件添加新的方法而用修改装饰者,反之亦可2. 代码示例 首先构造基类1 class Beverage 2 { 3 public: 4 virtual int cost() = 0; 5 }; 然后 定义组. 阅读全文
摘要:
假设一个数据有三个部分显示数据的, 分别是 max, min,average,我们可以写下这个一个类: 1 class Datashow 2 { 3 public: 4 void measurmentChanged 5 { 6 float temp = getTemplate(); 7 float humidity = getHumdity(); 8 float pressure = getPressure(); 9 10 average.updata(temp, humidity, pressure); 11 max.updata(temp, humidity, pressure); 12. 阅读全文
摘要:
1 class Person: 2 population = 0 3 def __init__(self, name): 4 self.name = name 5 Person.population += 1 6 def __del__(self): 7 print 'now,%d destory'%Person.population 8 print "\n" 9 def sayHi(self): 10 print 'Hello, how are you%d'%Person.population 11 print "\n" 阅读全文
摘要:
1. python 用关键字 ctypes 来导入dll。有三种导入dll的方式:cdll(): dll函数以c方式导出 windll(): dll 函数以标准方式导出 oledll(): com 方式导出 如: 1 from ctypes import *2 3 msvcrt = cdll.msvcrt 4 message_string = "hello world\n" 5 msvcrt.printf("testing: %s", message_string)调用c运行库的printf 函数。2. c&c++数据类型和python数据类型的 阅读全文
摘要:
1. 基址的概念 基址是什么? 从C++内存模型上来讲, 基址就是一个全局变量, 也就是第一次申明的类的地址。比如有一个类 1 class test 2 { 3 test(); 4 ~test(); 5 6 private: 7 char* name_; 8 int hp_; 9 int mp_;10 role* role_;11 } C++的内存模型是这样的。在new test()的时候, 其对象的地址为 this(比如:0x0040320),那成员变量 name的地址为this(因为没有虚函数列表),hp_的地址为this+0x4, mp_的地址为this+0x8, role_的地址就为. 阅读全文
摘要:
1. 序列号保护机制 俗称注册码。验证用户名和序列号之间的书写映射关系。有以下几种分类: 以用户名作为自变量,用过函数F变换后得到注册码。序列号= F(用户名) 通过注册码验证用户的正确性。 用户名 = F-1(序列号) 通过对等函数检查注册码。F1(用户名) = F2(序列号) 同时采用用户名和序列号作为自变量。特定值=F3(用户名, 序列号) 下面是一个通过对等函数检查注册码的列子:我们反汇编下代码: 这里是得到用户名和密码。然后: 这样就可以着重分析 CALL serial.0040137E ; 用户名转换 和CALL serial.004013D8 ; 转换后的用户名和密码作为参数进行 阅读全文
摘要:
1. CPU状态标志 状态标志位是汇编条件处理的基石。CF(carry flag)进位标志PF(parith flag)奇偶标志AF(auxiliary carry flag)赋助进位标志ZF(Zero flag)零标志SF(sign flag)符号标志(有符号,无符号)OF(overlow flag)溢出标志2. 布尔和比较指令2.1 and 影响: 总是清除CF OF, 修改ZF, PF 描述: 对每个操作数进行位与计算,结果保存在目的操作数中。 例子: 有如下的代码: 我们调试一下: 2.2 or 影响: 总是清除CF OF, 修改ZF, PF 描述: 对每个操作数进行位或计算,结果保. 阅读全文
摘要:
WindDbg主要以命令方式工作,主要有三类命令:标准命令,元命令和扩展命令。1. 标准命令 通常是一到二个字符或符号。a: 调试 g----------恢复运行 t--------- 单步步入 p----------单步步过b: 观察修改寄存器 r---------观察修改寄存器c: 观察栈的命令 k---------观察栈调用d: 断点 BP----------软件断点 BA----------硬件断点 BL----------列出所有断点 BC----------清除断点 BD---------禁止断点 BE---------重新启用断点e: 显示和控制现场: ~f:显示进程: |g:. 阅读全文
摘要:
1. 小尾循序 intel 处理器使用小尾循序的方案存取内存数据。所以我们这样定义一块数据的时候:在内存中实际的表示是:2. movzx和movsx 当我们试图从一个较小的操作数想一个较大的操作数移动数据的时候就会发生问题:当然我们可以用如下方式解决:mov eax, 0mov bx, 1234hmov eax,ebx但是当我们遇到有符号数字时候还是出错了。所以intel设计了movzx和movsx指令来处理从较小的操作数向较大的操作数移动数据。其中movzx给无符号的用, movsx给有符号的用。3. 翻转字符串 1 ;翻转字符串 2 .data 3 source byte "th 阅读全文