- 博客(71)
- 收藏
- 关注
转载 windows下zlib库的编译与使用
一、zlib库的编译 首先要下载这个库,这个谷歌和百度也都可以找得到的。我下载的是zlib-1.2.5,下载完解压出来即可。下边就开始编译吧。(包括动态库和静态库两种)1. 首先开启VS2010的Command Prompt (32bit),也就是命令提示窗口。2. 进入到zlib-1.2.5/contrib/masmx86目录,执行bld_ml32.bat。(同理,
2016-04-21 12:15:30
19811
1
转载 windows下libcurl的使用
使用的是curl-7.26.0版本,这个版本下的根目录下有.dsw文件,个人只是觉得使用编译方便点,其他版本未深究解压打开根目录下的curlxxx.dsw选择libcurl,单编译这个release=======================使用的时候 指定VC路径include到目录里面的indcludelib库指到刚编译
2016-04-08 18:36:53
1285
转载 IOS探索之调整UILabel行高间距(利用iOS 6的特性来手动调整行间矩)
http://www.cocoachina.com/bbs/read.php?tid=178403 #define LINESPACE 20 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 200)]; [label setBackgroundColor:[U
2016-03-03 18:11:33
526
转载 IOS探索之Block的内部实现
首先,看看没有block的C函数以及编译后的结果:#include int main(){ return 0;}12345编译代码中的block:这里我们可以看到一个block的C实现。#ifndef BLOCK_IMPL#define BLOCK_IMPLstruct __block_impl { void *isa; int Flags; int
2016-01-09 15:27:16
475
转载 OC中Block的原理、实现及注意事项
Block在Objc中,GCC编译器的更新引入了Block语法,这为objc语言提供了良好的闭包的功能,并为 Mac OS 与 iOS 的多个系统API所使用。它的基本语法如下//语法形式return_type (^block_name)(parameters)//实现int addtional = 5;int (^addBlock)(int a,int b) = ^(in
2016-01-09 15:24:13
3480
转载 iOS多线程编程技术NSThread、Cocoa NSOperation、GCD三者使用详解
简介iOS有三种多线程编程的技术,分别是:[html] view plaincopy(一)NSThread (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch) 三种方式的优缺点介绍:1)NSThread优点:NSThread 比其他两个轻量
2016-01-08 11:04:56
598
原创 IOS探索之从拍照中获取图像对应的ALAsset
打开相机//先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;// if (![UIImagePickerController isSour
2016-01-07 11:40:02
3796
1
转载 典型Top K算法
Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
2016-01-05 15:47:12
483
转载 LZW编解码算法(C实现)
代码中加入了自己的一些注释,以便于阅读理解。程序由五个模块组成lzw.h 定义了一些基本的数据结构,常量,还有变量的初始化等。#ifndef __LZW_H__#define __LZW_H__//------------------------------------------------------------------------------
2014-02-17 15:02:53
3121
转载 哈夫曼编解码的C++实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525
2014-02-13 14:02:11
853
转载 哈夫曼编码
思想:得到哈夫曼树后,自顶向下按路径编号,指向左节点的边编号0,指向右节点的边编号1,从根到叶节点的所有边上的0和1连接起来,就是叶子节点中字符的哈夫曼编码。下图体现了哈夫曼编码的过程: #include stdio.h>#include stdlib.h>#include string.h>//哈
2014-02-13 12:36:53
658
转载 编写一个垃圾回收器
每当我倍感压力以及有很多事情要做的时候,我总是有这样一种反常的反应,那就是希望做一些其他的事情来摆脱这种状况。通常情况下,这些事情都是些我能够编写并实现的独立的小程序。一天早上,我几乎要被一堆事情给整疯了——我得写我那本《游戏编程模式》、处理一些工作上的事情、还要准备一场Strange Loop的演讲,然后这时我突然想到:“我该写一个垃圾收集器了”。是的,我知道那一刻让我看上去
2013-12-30 14:39:52
981
原创 GBK到UTF8编码转换的C++实现
std::string GBKToUTF8(const std::string& strGBK){ WCHAR * str1; int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); str1 = new WCHAR[n]; MultiByteToWideChar(CP_ACP, 0, strGBK.c_s
2013-12-02 22:20:50
964
转载 Windows下内存映射文件的工作原理及使用方法
一、引言 WIN32 API为我们提供了一种进行文件操作的高效途径,即内存映射文件。内存映射文件允许我们在WIN32进程的虚拟地址空间中保留一段内存区域,把目标文件映射到这段虚拟内存之中。我们可以用存取内存数据的方式直接操作文件中的数据,就好像这些数据放在内存中一样。而实际上,我们并没有、也不需要调用API函数来读写文件,更不需要自己提供任何缓冲算法,操作系统将会为我们完成这些工作。使用内存
2013-09-21 21:40:14
1335
转载 NAT原理与NAT穿越
最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下。先做一个约定:内网A中有:A1(192.168.0.8)、A2(192.168.0.9)两用户 网关X1(一个NAT设备)有公网IP 1.2.3.4内网B中有:B1(192.168.1.8)、B2(192.168.1.9)两用户, 网关Y1(一个NAT
2013-09-06 10:25:27
565
转载 NAT地址转换过程
NAT地址转换过程如下:1、客户机将数据包发给运行NAT的计算机。 2、NAT主机将数据包中的源端口号和源私有IP地址转换成自己的端口号和公网的IP地址,然后将数据包发给外部网络的目的主机,同时记录一条跟踪信息在地址转换映像表中,以便向客户机发送响应信息。 3、外部网络发送回送信息给NAT主机。 4、NAT主机根据映像表中的记录,将所收到数据包的端口号
2013-09-05 13:19:11
2102
转载 ARP地址解析过程(同一子网和不同子网)
人们最熟悉的网络可以说是以太网,而且人们都知道,每块网卡都有一个编号,也就是网卡地址(称为MAC地址),代表计算机的物理地址。另外,网络中的每一台计算机都分配了一个IP地址,这样,每台计算机上都有两个地址,IP地址和MAC地址。IP地址并不能代替MAC地址,前者是在大网中为了方便定位主机所采用的方式,如果网络规模不大,完全可以不使用IP地址。但是,无论什么网络环境物理地址都是要使用的。因为物理
2013-09-02 10:30:06
3264
转载 ICMP重定向
ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发ICMP应用分析-ICMP重定向 ICMP虽然不是路由协议,但是有时它也可以指导数据包的流向(使数据流向正确的网关)。ICMP协议通过ICMP重定向数据包(类型
2013-09-02 01:57:43
1334
翻译 路由器对数据的转发操作
路由器转发IP报文的依据是路由表,通过匹配路由表里的路由项来实现对IP报文的转发。如图1所示,当路由器收到一个IP报文的时候,将报文中的目的IP地址提取出来,然后与路由表中路由表项包含的目的地址进行比较。如果与某路由项中的目的地址相同,则认为与此路由项匹配;如果没有路由项能够匹配,则丢弃该IP报文。 图1 路由器多跳转发流程图IP报文中的
2013-08-28 10:30:08
3926
原创 Hook API(挂钩API)技术
Hook API,简单说,就是给API函数挂钩,将本应该调用的API函数拦截,使其转而调用我们自己的函数。这里,我主要介绍如何利用IAT挂钩来实现API拦截。在我们启动目标程序时,操作系统负责为目标程序创建虚拟地址空间,并将这个可执行模块(就是目标程序)加载到地址空间中去,接下来,系统会将目标程序所需要的DLL文件映射到地址空间。我们将需要映射到地址空间的目标程序及所需DLL统称为模块(Mod
2013-08-25 00:13:00
2621
原创 DLL注入
每个进程都有独立的地址空间,违规访问可能会导致内存访问违规,但是有时候我们需要打破进程的界限,访问另一个进程的地址空间,这里就可以用到我们的DLL注入技术了,将我们的DLL插入到另一个进程的地址空间,一旦你的DLL进入另一个进程的地址空间,你就可以对该进程为所欲为了。。。下面介绍几种DLL注入技术:利用注册表注入DLL在注册表中有一个关键字AppInit_DLLs,它的路径是:
2013-08-21 01:30:41
1117
原创 谨慎使用DLL_THREAD_ATTACH,以及利用DLL_THREAD_ATTACH来阻止远程线程的创建执行
DLL_THREAD_ATTACH的调用时机当进程创建一个线程的的时候,系统会检查当前映射到该进程的地址空间中的所有DLL文件映像,并用DLL_THREAD_ATTACH来调用每个DLL的DllMain函数,新创建的线程负责执行所有DLL的DllMain函数中的代码。系统不会让进程的主线程调用DLL_THREAD_ATTACH的值来调用DllMain函数。此时新线程已经被创建但尚未
2013-08-19 20:32:03
7786
2
转载 动态链接库与静态链接库的区别
原文地址:动态链接库与静态链接库的区别(转载)作者:牛妞静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE独立的 DLL文件。静态链接库和动态链接库的另外一个区别在于静态
2013-08-19 18:27:11
476
原创 内存修改器原理
BOOLWINAPIReadProcessMemory( HANDLEhProcess, //待读进程的句柄 LPCVOIDlpBaseAddress, //目标进程中待读内存的起始地址 LPVOIDlpBuffer, //用来读取数据的缓冲区
2013-08-19 18:27:09
1455
原创 Windows全局钩子dll(键盘)
// dllHookkb.cpp : Defines the entrypoint for the DLL application.//#include "stdafx.h"#include "dllHookkb.h"#ifdef _MANAGED#pragma managed(push, off)#endif#pragmadata_seg("YCIShared2010")H
2013-08-19 18:27:07
1490
转载 Windows内存管理与结构体MEMORY_BASIC_INFORMATION
原文地址:Windows内存管理与结构体MEMORY_BASIC_INFORMATION作者:Jess23基于32位Windows,摘自http://blog.csdn.net/yeming81/archive/2008/01/16/2046193.aspx 1. 进程地址空间 软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0x
2013-08-19 18:27:05
3980
转载 (转)vector中使用erase删除…
原文地址:(转)vector中使用erase删除元素作者:独自等待很容易受数组的影响,写出如下代码:std::vecotr::iterator it =vc.begin();for( ; it != vc.end(); it++ ){ if( *****) vc.erase(it);}原因是vector中在删除一个元素后,迭代器会自动指向下一个元素。所以,上面的代码很可
2013-08-19 18:27:03
729
转载 环境淬炼远见
原文地址:环境淬炼远见作者:李开复环境淬炼远见李开复 非常感谢高希均教授和郭台铭董事长颁发给我的《华人企业领袖远见奖》。我说不上企业领袖,更不敢自称有远见,我其实真的很平凡,只是有幸在最佳的时间在最佳的环境里出生、学习、成长、发展。我和朋友开玩笑说我是:“大陆原料,台湾制造,美国加工,卖回中国市场。”今天我就谈谈这四点吧! 先谈谈大陆原料。我出生在台湾,算是台湾“外省人”。父亲194
2013-08-19 18:27:01
597
原创 避免僵死进程
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始
2013-08-19 18:26:59
510
原创 给套接字设置超时检测
在涉及套接字I/O操作上设置超时的方法有以下3种。调用alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上。使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法
2013-08-19 18:26:56
1081
原创 connect的UDB套接字
首先,罗列几个即将用到的自定义函数。以下是Read函数原型:ssize_tRead(int fd, void *ptr, size_t nbytes){ ssize_t n; if( (n = read(fd, ptr, nbytes)) == -1) err_sys("readerror"); return(n);}以
2013-08-19 18:26:54
680
原创 recvmsg和sendmsg函数
这两个函数是最通用的I/O函数。实际上我们可以把所有read、readv、recv和recvfrom调用替换成recvmsg调用。类似地,各种输出函数调用也可以替换成sendmsg调用。 #include ssize_t recvmsg(int sockfd,struct msghdr *msg,int flags); ssize_t sendmsg(int sockfd,s
2013-08-19 18:26:52
1654
原创 套接字和标准I/O
我们经常使用也称为UNIXI/O——包括read、write这两个函数及它们的变体(recv、send等等)——的函数执行I/O。这些函数围绕描述符工作、通常作为UNIX内核中的系统调用实现。执行I/O的另一个方法是使用标准I/O函数库。标准I/O函数库可用于套接字,不过需要考虑以下几点。通过调用fdopen,可以从任何一个描述符创建出一个标准I/O流。类似地,通过调用fileno,
2013-08-19 18:26:50
1068
原创 高级轮询技术——/dev/poll接口与kqu…
这里介绍两种机制,它们跟select和poll这两个函数具备类似的特性。/dev/poll接口Solaris上名为/dev/poll的特殊文件提供了一个可扩展的轮询大量描述符的方法。select和poll存在的一个问题是,每次调用它们都得传递待查询的文件描述符。轮询设备能在调用之间维持状态,因此轮询进程可以预先设置好待查询描述符的列表,然后进入一个循环等待事件发生,每次循环回来时不必再次设
2013-08-19 18:26:48
3638
2
原创 select与pselect的信号屏蔽
pselect() 函数的原型是:int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);它和 select() 函数基本相同,区别在于两个不同的
2013-08-19 18:26:46
1239
1
原创 C/C++文件读写
一、ASCII 输出为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取代fstream.h>,所有的C++标准头文件都是无后缀的。)。这是的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstrea
2013-08-19 18:26:41
637
原创 结构与联合
结构: struct SELF_REF1{ int a; struct SELF_REF1 b; int c;};这是一种错误的自引用,结构内包含结构体,它也包含自己的b,这样就是一个无止尽的递归程序,相反,换成下面这样,就是正确的。 struct SELF_REF1{ int a; struct SELF_REF
2013-08-19 18:26:39
575
原创 析构函数为什么要写成虚函数
#includeclass Base { public: Base(){ mPtr = new int; } ~Base(){ delete mPtr;coutprivate: int*mPtr; } ;class Derived : public Base { public: Derived(){ mDerived = new
2013-08-19 18:26:35
1481
原创 mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改
2013-08-19 18:26:33
401
原创 论C++类对象赋值
class Demo{public: Demo() {} Demo(intj) { cout<<"Demo int:" this->i =j; } Demo(constDemo& d) { cout } Demo& operator= (const Demo& d) { cout<<"operator=
2013-08-19 18:26:31
505
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人