char函数

c++之STL总结

浪尽此生 提交于 2019-12-11 00:59:23
c++中的STL(Stand Template Library)提供了最基本的数据结构和算法,功能十分强大。主要分为 容器 (数组,队列,链表,栈,集合等等), 迭代器 (一种对象,用来遍历容器中的元素)和常见算法(排序,反转等) 文章目录 容器 字符串 vector list deque stack multiset&set multimap&map 容器 字符串 包含文件:c++头文件中: #include<string> 常用方法: 初始化: string str:生成空字符串 string s ( str ) :生成字符串为str的复制品 string s ( str , strbegin , strlen ) :将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值 string s ( cstr , char_len ) :以C_string类型cstr的前char_len个字符串作为字符串s的初值 string s ( num , c ) :生成num个c字符的字符串 string s ( str , stridx ) :将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值 直接用另一个字符串赋值 如str2 . assign ( str1 ) ; 即用str1给str2赋值 . 用另一个字符串的一个子串赋值 如str3

IO系统-文件与目录操作

老子叫甜甜 提交于 2019-12-10 23:23:39
1.文件内核数据结构 一个打开的文件在内核中使用三种数据结构表示: (1)文件描述符表 文件描述符标志 文件表项指针 (2)文件表项: 文件状态标志:读、写、追加、同步和非阻塞等状态标志 当前文件偏移量 i节点表项指针 引用计数器 (3)i节点 文件类型和对该文件的操作函数指针 当前文件长度 文件所有者 文件所在的设备、文件访问权限 指向文件数据在磁盘上所在位置的指针等。 2. 原子操作 (1)文件追加 打开文件时使用 O_APPEND 标志,进程对文件偏移量调整和数据追加成为 原子操作 。 O_APPEND write(){ //write成为一个原子操作 1)从i节点中读取文件长度作为当前偏移量 2)往文件中写入数据 3)修改i节点中文件长度 } 内核每次对文件写之前,都将进程的当前偏移量设置为该文件的尾端,这样不再需要lseek来调整偏移量。 (2)文件创建: 对open函数的 O_CREAT和O_EXCL 的使用,若该文件存在,open将失败,否则创建该文件,并且使得文件是否存在的判定和创建过程成为原子操作。 3. I/O处理方式 3.1 I/O处理的五种模型 阻塞I/O模型:若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回,如:终端、网络设备的访问。 非阻塞模型:当请求的I/O操作不能完成时,则不让进行进程休眠,而且返回一个错误。如:open

抖音越狱检测深度分析

孤街浪徒 提交于 2019-12-10 23:00:28
如有合作,交流方面的意愿,请联系QQ:571652571 iOS抖音App安全机制分析 准备工作 工具   在本文中,用到的工具有IDA Pro, Frida, TheOS,文本编辑器(如VSCode) 脱壳   首先我们进行静态分析,第一步要脱壳,市面上常见的工具有dump-decrypted/frida-ios-dump/clutch等工具。使用frida查看App加载了哪些自带动态库,并对这些模块进行脱壳: Process.enumerateModulesSync().forEach(function(e){if(e.path.indexOf('.app')!=-1){console.log(e.path)}}) .../Aweme.app/Aweme .../Aweme.app/Frameworks/AgoraRtcEngineKit.framework/AgoraRtcEngineKit .../Frameworks/ByteRtcEngineKit.framework/ByteRtcEngineKit .../Aweme.app/Frameworks/AwemeDylib.framework/AwemeDylib 越狱检测分析   由于抖音二进制相当大,单单IDA分析便需要几十分钟,而越狱逻辑可能隐藏在任何地方,而不限于在进程初始化时(mod_init_func)

IO系统-标准C的I/O和文件I/O

岁酱吖の 提交于 2019-12-10 22:39:10
1.标准C的I/O 1.1常用函数和结构体 char *fgets(char *s, int size, FILE *stream); //整行输入 int printf(const char *format, …); int fprintf(FILE *stream, const char *format, …); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); typedef struct iobuf{ int cnt; //剩余的字节数 char *ptr; //下一个字符的位置 char *base; //缓冲区的位置 int flag; //文件访问模式 int fd; //文件描述符 }FILE; 标准I/O函数都是带缓存的。 stdin:标准输入,针对键盘 stdout:标准输出,针对屏幕 stderr:标准出错,针对屏幕 三个都是FILE类型的结构体指针,成为流指针 标准C的IO缓存类型 全缓存 要求填满整个缓冲区后才进行I/O系统调用操作,对于磁盘文件通常使用全缓存访问。 行缓存 涉及一个终端时(例如 标准输入和标准输出 ),使用行缓存;

结构体(结构体嵌套、结构体指针、结构体参数传递)

谁都会走 提交于 2019-12-10 19:13:35
结构体(struct) 1、基本概念 结构体-----将不同类型的数据成员组织到统一的名字之下,适用于对关系紧密,逻辑相关、具有相同或不同类型的数据进行处理 2、结构体定义格式 struct 结构名(也可称作结构标识符) { 类型 变量名; 类型 变量名; ······ }; struct 结构名 结构变量; 或者 struct 结构名 { 类型 变量名; 类型 变量名; ······ }结构变量; 例:声明结构体类型的同时定义变量名 1 struct student 2 { 3   int num; 4 }teacher; (声明结构体类型仅仅是声明了一个类型, 系统并不为之分配内存 ,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了 变量 时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。) 定义了一个结构名为student的结构体和一个结构变量teacher,如果省略变量名(teacher),就变成了对结构的声明,上述结构体声明也可分开写 1 struct student 2 { 3   int num; 4 }; 5 6 struct student teacher; 与上面效果相同,可理解为 struct student类似于int ,而我们用的是teacher类似于变量,如果省略结构名,则称之为无名结构

可变参数的使用

主宰稳场 提交于 2019-12-10 17:27:39
在ANSI C中,这些宏的定义位于stdarg.h中: typedef char *va_list; va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数): #define va_start(list,param1) ( list = (va_list)&param1+ sizeof(param1) ) va_arg宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(mode参数描述了当前参数的类型): #define va_arg(list,mode) ( (mode *) ( list += sizeof(mode) ) )[-1] va_end宏,清空va_list可变参数列表: #define va_end(list) ( list = (va_list)0 ) 注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍 如:#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 为了理解这些宏的作用,我们必须先搞清楚:C语言中函数参数的内存布局。首先,函数参数是存储在栈中的,函数参数从右往左依次入栈。 以下面函数为讨论对象: void test(char

setsockopt 设置socket

北城余情 提交于 2019-12-10 16:06:19
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历 TIME_WAIT的过程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限: int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //接收时限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 4.在send()的时候,返回的是实际发送出去的字节(同步

C++文件操作详解(ifstream、ofstream、fstream)

爱⌒轻易说出口 提交于 2019-12-10 15:57:20
C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstream: 可同时读写操作的文件类 (由iostream引申而来) 打开文件(Open a file) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open(): void open (const char * filename, openmode mode); 这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合: ios::in 为输入(读)而打开文件 ios::out 为输出(写)而打开文件 ios::ate 初始位置:文件尾 ios::app 所有输出附加在文件末尾 ios::trunc 如果文件已存在则先删除该文件 ios::binary 二进制方式 这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据

[转]安卓加固之so文件加固

心已入冬 提交于 2019-12-10 09:02:45
一、前言   最近在学习安卓加固方面的知识,看到了 jiangwei212 的博客,其中有对so文件加固的两篇文章通过节加密函数和通过hash段找到函数地址直接加密函数,感觉写的特别好,然后自己动手实践探索so加密,这里记录一下学习遇到的困难和所得吧,收获还是非常大的。 二、通过加密节的方式加密函数  1、加解密思路   加密:我们自己写一个Demo根据ELF文件格式,找到我们要加密的节,加密保存在ELF文件中   解密:这里有一个属性__attribute__((constructor)),这个属性使用的节优于main先执行,使我们解密有了可能。  2、实现流程   ①编写我们的native代码,在native中将要加密的函数置于一个节中,并将解密函数赋予__attribute__((constructor))属性     a.在函数申明后面加上 __attribute__((section(".mytext"))) ,将函数定义在我们自己的section中     b.我们需要编写一个解密函数,属性用__attribute((constructor))申明,这样就可以在在so被加载的时候,在main之前将我们的节解密。      然后使用ndk-build将native代码编译成so文件   ②编写加密程序(我这里使用VS2010)     a.解析so文件,找到

PHP如何写扩展

╄→尐↘猪︶ㄣ 提交于 2019-12-10 07:29:40
PHP取得成功的一个主要原因之一是她拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。 扩展API的引入使PHP3取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。现在,两个版本过去了,API仍然和PHP3时的非常相似。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。 有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。 如果以上的两个理由都和你没什么关系,同时你感觉自己没有冒险精神,那么你可以跳过本章。 本章教你如何编写相对简单的PHP扩展,使用一部分扩展API函数。对于大多数打算开发自定义PHP扩展开发者而言,它含概了足够的资料。学习一门编程课程的最好方法之一就是动手做一些极其简单的例子,这些例子正是本章的线索。一旦你明白了基础的东西