自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 学习 SSL / TLS 协议中的问题

问:SSL 链接建立过程中,密码套件、证书、密匙协商算法到底是怎样的?答:​ SSL 链接的建立过程可以分为4个阶段:服务端与客户端交换信息(双方发送 Hello 信息):SSL 版本、随机数、会话 ID、密码套件(密钥交换算法、MAC 算法、加密算法)、压缩方法(可选)服务端向客户端发送信息:服务端证书(证书链)、服务器公钥(可选,视密匙协商算法定,如对于RSA 算法,其证书中已包含公钥 ,而 DHE 要,DH 不用)、客户端证书请求(可选)、服务器握手完成信号客户端向服务端发送信息:客户端

2022-03-04 15:17:06 458

原创 折半查找(数据结构)

文章目录0x01 原理0x02 使用条件0x03 时间复杂度0x04 代码实现0x01 原理​ 从表的中间记录开始, 如果给定值和中间记录的关键字相等, 则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。0x02 使用条件序列为连续存储序列为有序序列0x03 时间复杂度​ 折半查找的时间复杂度为 O(log n) 。0x04 代码实现//线性表查找 ———— 折半查找

2021-07-11 20:48:23 424

原创 常用 Peano 余项泰勒公式

Peano 余项泰勒公式设 f(x)\large f(x)f(x) 在 x=x0\large x=x_{0}x=x0​ 处 n\large nn 阶可导,则f(x)=f(x0)+f′(x0)(x−x0)+f′′(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n+o((x−x0)n)\large f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{f^{\prime \prime}

2021-06-25 18:06:11 8472

原创 常用等价无穷小

常用等价无穷小当 x→0x \to 0x→0 时x∼sin⁡x∼tan⁡x∼arcsin⁡x∼arctan⁡x∼ln⁡(1+x)∼ex−1(1+x)α−1∼αx,1−cos⁡x∼12x2,ax−1∼xln⁡ax−sin⁡x∼arcsin⁡x−x∼x36,x−ln⁡(1+x)∼x22tan⁡x−x∼x−arctan⁡x∼x33\huge x \sim \sin x \sim \tan x \sim \arcsin x \sim \arctan x \sim \ln (1+x) \sim \mathrm{

2021-06-22 17:10:29 1020

原创 常见奇偶函数

常见的奇偶函数以下为常见奇函数:sin⁡x,tan⁡x,arcsin⁡x,arctan⁡x,ln⁡1−x1+x,ln⁡(x+1+x2), e ex+1,f(x)−f(−x)\huge \sin x, \tan x, \arcsin x, \arctan x,\ln \frac{1-x}{1+x},\\\huge \ln \left(x+\sqrt{1+x^{2}}\right), \frac{\text { e }}{e^{x}+1}, f(x)-f(-x)sinx,tan

2021-06-21 15:55:48 18026 1

原创 对称加密——IDEA

文章目录0x01 IDEA 简介0x02 IDEA 加解密过程一、子密匙生成二、明文加密三、解密0x03 参考0x01 IDEA 简介​ IDEA(International Data Encryption Algorithm,国际数据加密算法),于1991年由XueJia Lai(来学嘉)和L. Massey提出。​ 这种算法是在 DES 算法的基础上发展出来的,类似于三重 DES。发展 IDEA 也是因为感到 DES 具有密钥太短等缺点,已经过时。IDEA 的密钥为 128 位,这么长的密钥在

2021-06-21 15:06:32 1380

原创 与C 区别

文章目录0x01 两者联系0x02 具体区别0x01 两者联系​ C 可以说是 C++ 的一个子集,C++ 是 C 的一个增强。0x02 具体区别C++ 为强类型语言在 c 中允许隐式转换,c++ 要求必须使用显示转换C++ 为面向对象语言 (封装,继承,多态)拥有了泛型编程的机制(Template)增加异常处理。增加了运算符与函数的重载增加了标准模板库(STL)增加了引用概念,使得引用函数参数带来子很大方便变量的声明更灵活。C语言要求在函数体开头声明变量,再是执行语句

2021-06-11 15:43:27 160

原创 与 C 区别(c++)

文章目录0x01 两者联系0x02 具体区别0x01 两者联系​ C 可以说是 C++ 的一个子集,C++ 是 C 的一个增强。0x02 具体区别C++ 为强类型语言在 c 中允许隐式转换,c++ 要求必须使用显示转换C++ 为面向对象语言 (封装,继承,多态)拥有了泛型编程的机制(Template)增加异常处理。增加了运算符与函数的重载增加了标准模板库(STL)增加了引用概念,使得引用函数参数带来子很大方便变量的声明更灵活。C语言要求在函数体开头声明变量,再是执行语句

2021-06-10 15:26:48 99

原创 Top-k 问题

文章目录0x01 问题介绍0x02 常规思路0x03 BFPRT 算法0x01 问题介绍​ 给定线性序集中 n 个元素和一个整数 k ,1<k≤n1<k≤n1<k≤n ,要求找出这 n 个元素中第 k 大或者 k 小的元素,简称 TOP-K 问题。0x02 常规思路​ 可以分为两步:进行快速排序,得到有序序列从有序序列中选取第 k 个缺点:此种方法使用了快速排序,所以快速排序的缺点也都拥有,如最坏情况的发生(排序的序列为有序序列),且本身也只是求第 k 的数,目的不是

2021-06-09 13:41:40 117

原创 声明与类型(指针)

文章目录0x01 介绍0x02 初始化0x03 void *0x04 复杂声明0x01 介绍​ 指针本身也是一个变量,其与其它普通变量的不同在于,它的值是一个内存地址,且明确了该内存的宽度(这个由指针的类型确定)。​ 若我们用另一个指针存储了这个指针的地址,那么这个 “另一个指针” 被称为二级指针。0x02 初始化​ 以下两种方法的初始化等效。// 方法一int a =1;int *p = &a;// 方法二int a=1;int *p;p = &a;0x0

2021-06-08 09:09:23 274

原创 联合体(结构体)

0x01 联合体​ 多个不同的变量共同使用一段内存的结构称为联合体。可以理解为多个变量的起始地址一样,但包含的内存范围不一样。我们可以使用 union 关键字声明。//实际上常用的声明方法和结构体类似typedef union _fun{ char a[15]; int i;}fun,*pfun;fun a;​ 其大小为联合体内最大的字节数(如上面的15字节),同时也要是最大字节类型变量的整数倍(所以占用空间为16字节)。...

2021-06-08 09:08:56 399

原创 枚举类型(c)

0x01 枚举类型​ 当一个变量的值的范围是确定的,我们就可以自定义一种变量类型,这种自定义的变量我们称为枚举变量,大小为 4 个字节(x86、x64 一样)。定义方法如下:typedef enum _枚举名{ //以下数据即为枚举类型的值范围 //默认第一个标识为 0 ,后续依次递增,允许自定义标识 pass;}name,*pname;//假设以星期为一个枚举类型typedef enum _day{ Monday,Tuesday,Wednesday,Thurs

2021-06-08 09:08:24 93

原创 声明与使用(结构体)

文章目录0x01 结构体0x02 运算符0x01 结构体​ 结构体中的数据类型有两种:内建类型、构造类型。内建类型就是如同字符、数组一类直接支持的,而构建类型就是如同结构体一样的。​ 结构体本身也是由内建类型的数据或者其它构建类型的数据组成。常用的声明方法如下typedef struct _strudent{ int id; int age; char name[20];}student,*pstudent; //调用 pstudent 等效于 struct _s

2021-06-08 09:07:48 203

原创 对齐规则(结构体)

0x01 结构体对齐规则​ 结构体常规的对齐规则为:基本类型的变量,要求其对齐地址为类型字节大小的整数倍;结构体类型的变量要求为结构体内最大字节变量的字节大小的整数倍结构体的整体大小为结构体内最大字节的整数倍​ 对于对齐规则我们也可以自定义,使用#pragma pack(n) 即可按 n 字节地址倍数对齐(字节数小于 n 的变量按自身对齐规则对齐)。...

2021-06-08 09:07:13 199

原创 拷贝(结构体)

0x01 拷贝​ 结构体的拷贝可以分为:浅拷贝、深拷贝、写时拷贝。​ 浅拷贝是指将内容直接赋给另一个,当结构体中出现了指针时,指针的拷贝是将原指针指向的地址赋予新指针,一旦通过原指针对地址进行其它操作,可能会使得新指针出现问题。(如通过原指针 free 内存,新指针变成野指针)C++ 和 C 的编译器默认使用浅拷贝,深拷贝需要程序员自己实现。​ 深拷贝是将内容拷贝过去,如同复制粘贴过去,包括指针也是拷贝内容过去。​ 写时拷贝,利用了引用计数,当我们 free 一个指针的内存时,只需要将

2021-06-08 09:03:43 1475

原创 堆排序(数据结构)

文章目录0x01 原理0x02 时间复杂度0x03 例子0x04 实现思路0x01 原理​ 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;0x02 时间复杂

2021-06-08 09:02:58 168

原创 冒泡排序(数据结构)

文章目录0x01 原理0x02 时间复杂度0x03 例子0x01 原理​ 冒泡排序它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上漂浮(左移),或者使关键字大的记录如石块一样逐渐向下坠落(右移)。0x02 时间复杂度​ 冒泡排序的时间复杂度为 O (n2n^2n2) ,且是一个稳定排序,0x03 例子右移冒泡(图片来源于菜鸟教程)题目:5,6,3,7,9,12,46,8左移冒泡过程:5,6,3,7,9,12,8,455,6,3,7,

2021-06-08 09:02:08 187

原创 声明(字符串)

文章目录0x01 引号0x02 多字节字符串0x03 声明0x01 引号​ 对于双引号,表示字符串,结尾自带一个不可见字符\0,存储于静态区,如:"a" 表示有两个字符,其中结尾处有一个不可见的字符 \0 。​ 对于单引号,表示字符常量,不存储于静态区,不占内存,赋值给谁后,就存储在哪里,只表示一个字符。0x02 多字节字符串​ 对于一个多字节字符串,如果没有特别规定则默认英文字符占一个字节,中文占两个字节;对于宽字符串,每个字母占的字节都是一样,均为两个字节。char str1[] ="

2021-06-07 13:22:11 943

原创 修改(字符串)

0x01 操作与库函数​ 对于字符串的操作函数按字符串类型可以分为两类:多字节字符串、宽字节字符串。多字节字符串:在原本的 ASCLL 字符集上发展而来,英文字符一个字节,中文两个字节宽字节字符串:Unicode 字符集,所有字符均为宽字节,如:UTF-16、​ 程序为这两种字符串提供三套 API ,对于多字节类型字符串,可以使用 strxxx 的函数;对于宽字节类型字符串,可以使用 wcsxxx 的函数。​ 还有一种 API 根据项目预先设定的字符串类型,自动转换为相对应的函数,函数一

2021-06-07 13:21:25 112

原创 多级指针(指针)

0x01 二级指针​ 指向变量的指针可以称为一级指针,而指向一级指针的指针可以称为二级指针。二级指针存放的内容就是一级指针的地址。应用:​ 当我们将指针地址作为实参传入函数中,函数中的形参必须使用二级指针。指针地址作为实参传入,故我们需要使用二级指针接受一级指针的地址,进行一次解引用后,就可以修改一级指针指向的地址。0x02 指针传参​ 函数中,指针传参会有很多中可能出现,但我个人感觉对于多种情况都可以用一种等效的方法理解,方法如下://假设存在一个函数int fun(int *p

2021-06-07 09:31:02 132

原创 引用与解引用(指针)

0x01 解引用​ 这是对指针的一种应用。解引用是指:通过指针,找到对应的内存和内存中的数据。我们可以通过解引用访问或修改指针指向的内存内容。​ 解引用后等价于指针指向的变量。int a =1;int *p = &a;//下面两者是等价的*p += 1;a += 1; 0x02 引用与解引用​ & 与 * 互为逆运算。& ,其作用是取变量的地址;* ,其作用是取地址对应的内存,内存长度由指针类型确定,void 类型表示不确定,GCC 默认一个字节。int

2021-06-07 08:51:44 14232

原创 内联函数(函数)

文章目录0x01 inline 关键字0x02 static 关键字0x01 inline 关键字​ 对于加了 inline 关键字的函数,我们常称为内联函数,在调用这个函数时,这个函数会像宏定义一样直接展开,不再像普通函数一样进行入栈出栈、传参等操作。其与宏的不同在于,宏不支持调试,但内联函数支持调试;inline 关键字的内联只是对编译器的一个建议,当编译器认为函数不复杂时,才会真正内联,所以决定权在于编译器,并非 inline 关键字。0x02 static 关键字​ 限定了函数只

2021-06-07 08:36:38 111

原创 调用约定(函数)

0x01 调用约定​ 调用约定规定了调用者和被调用者之间的栈上参数传递和清理。常见的有三种:cdecl、stdcall、fastcall。​ 在 x86 系统中的调用约定有:Cdecl:C 语言默认的调用约定参数从右往左依次入栈调用者栈平衡Stdcall需要声明参数从右往左依次入栈被调用者栈平衡Fastcall前两个参数放入ecx,edx,后面参数从右往左依次入栈被调用者栈平衡​ 在 x64 系统中的调用约定只有 fastcall,其它调用约定均被舍

2021-06-07 08:27:35 117

原创 传参(数组)

文章目录0x01 首地址0x02 参数0x01 首地址​ 对于首地址,其指向数组地址的开头,而其中 a 与 &a 所表达的意思是不一样的。int a[10] = {0};/** a:值为数组的首地址,类型为 int ** &a:值为数组的首地址,类型为 int (*a)[10]* 两者的值一样,均为数组的首地址* 两者的类型不一样,所以 a 所表示的有效范围为 sizeof(int)* &a 所表示的有效范围为 sizeof(int)*10* 类型的不一使得 +

2021-06-06 23:46:03 426

原创 函数的调用

0x01 函数调用​ 当我们调用其它函数库时需要包含其库文件。​ 如调用随机函数需要包含头文件 stdlib.h 。在使用 rand() 随机函数时,我们需要使用 srand((unsigned int)time(0)) 生成一个随机数种子,不然每次调用时获得的随机数并不随机。time(0):返回当前时间,类型为 time_t(实际上时长整型)unsigned int :srand () 输入应为 unsigned int 类型,所以我们使用了强制转换。...

2021-06-06 23:40:57 59

原创 优先级(运算符)

0x01 运算符优先级​ 口诀:括箭点,单算移比较,位辑三等逗​ 解释:括号、箭头号、点号、单目运算符、算数运算符、移位运算符、比较运算符、位运算符、逻辑运算符、三目运算符、赋值运算符、逗号...

2021-06-06 23:35:57 77

原创 自增符(运算符)

文章目录0x01 自增符0x01 自增符​ 对于 i++ 和 ++i ,其作用相似,执行顺序不一,前者先引用 i 再进行自增,后者相反。​ 在 C++ 中,i 是一个对象,使用 ++i 的效率高于 i++,但当其作为一个单独一行的语句时,两者效率时一样的。因为 ++i 返回一个引用,就是修改后的 i ,而 i++返回一个拷贝,拷贝的消耗大于引用。...

2021-06-06 23:33:14 247

原创 选择排序(数据结构)

文章目录0x01 原理0x02 时间复杂度0x03 例子0x01 原理​ 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。0x02 时间复杂度​ 选择排序的时间复杂度为 O(n2n^2n2) ,是一个不稳定排序。0x03 例子题目:2,1,8,3,4,9,6排序过程:1,2,8,3,4,9,61,2,8,3,4,9,61,2,3,8,4,9,61,2,3,4,8,9,61,2,3,4,6,8,9...

2021-06-06 23:20:11 52

原创 希尔排序(数据结构)

文章目录0x01 介绍0x02 原理0x03 时间复杂度0x04 参考0x01 介绍​ 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。0x02 原理​ 它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。​ 间隔由人选取,一般选 gap = len / 2,一轮排序后,间隔选取为 gap = gap / 2 。详细讲解可以查看参考0x03 时间复杂度​ 希尔排序时间复杂度是 O(n1.3

2021-06-06 22:45:46 294

原创 直接插入排序(数据结构)

文章目录0x01 原理0x02 时间复杂度0x01 原理​ 将序列分为两个部分,有序数列和无序数列,每次将一个待排序的数据元素,插入到前面己经排好序的数列中的适当位置,使数列依然有序,反复如此,直到完成排序。0x02 时间复杂度​ 时间复杂度为 O(n2n^2n2) ,且插入排序是一个稳定排序。稳定排序:假设数列中存在两个相同的数(如:两个 1 ),经过排序后,这两个 1 的顺序不变,这种排序叫做稳定排序。...

2021-06-06 22:35:18 111

原创 逻辑运算指令(汇编)

文章目录0x01 逻辑指令简介0x02 与或非指令0x03 移位指令一、左移二、右移0x01 逻辑指令简介​ 和 C 语言类似,逻辑运算可以有常见的与或非、移位的相关指令。0x02 与或非指令​ and 指令,即为与指令。​ or 指令,即为或指令。​ xor 指令,即为异或指令。​ not 指令,即为非指令。​ test 指令,将两个操作数相与,其结果并不保存(and 指令保存结果),并根据结果是否为 0 修改 ZF 标志位。​0x03 移位指令​ 在汇编中移位命令有很

2021-06-03 13:31:22 2161

原创 算术运算(汇编)

文章目录0x01 常见的算术运算指令0x02 加法0x03 减法0x04 neg 求补0x05 乘法0x06 除法0x07 参考0x01 常见的算术运算指令​ 我们常见的算术运算指令有:​ add (加法)、adc(带进位加法)、inc(加一)、dec(减一)、sub(减法)、sbb(带借位减法)、neg(求补)、cmp(比较)、mul(无符号数乘法)、imul(带符号数乘法)、div(无符号数除法)、idiv(带符号数除法)、cbw(字节转换为字)、cwd(字转换为双字)。​ 下面介绍其中

2021-06-02 18:15:36 1274

原创 标志寄存器操作

文章目录0x01 常见操作指令0x02 标志寄存器一、ZF标志二、PF标志三、SF标志四、CF标志五、OF标志六、DF标志位和串传送指令0x01 常见操作指令​ 在 CISC 中对于标志寄存器存在一些指令对标志寄存器操作,常见的有:LAHF、SAHF、PUSHF、POPF。LAHF:​ 指令可以将标志寄存器的低八位送入 AH 中,即将标志寄存器中的SF、ZF、AF、PF、CF 这五个标志位传送到 AH 的对应位置上。标志位寄存器位置如下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存

2021-06-02 16:10:58 1235

原创 传送指令小记(汇编)

文章目录0x01 常用指令0x02 mov 指令0x03 push/pop0x04 lea 指令0x01 常用指令​ 在传送指令中常用的有 mov、push、pop、lea 这四个指令0x02 mov 指令​ mov 指令是最常见的传送指令,基本格式为:mov dst src ;dst 表示传送内容的目标 ,src 表示传送内容的来源;dst 可以是寄存器、存储器;src 可以是寄存器、存储器、立即数;段寄存不可以直接使用 mov 指令传送如:mov ds 5、mov ds eax;

2021-06-02 15:16:18 461

原创 汇编指令集简介

文章目录0x01 寄存器0x02 指令简介0x03 指令集0x01 寄存器​ 寄存器不严谨的可以分为通用寄存器和专用寄存器。​ 以 32 位寄存器为例:​ 通用寄存器有:eax、ebx、ecx、edx,它们可以在所有地方使用。这四个并不是完全就是 “ 通用 ” ,它们还有各自的习惯用法。​ 源变址寄存器和目标变址寄存器有:esi、edi。esi 的作用是存放要处理的数据的内存地址,edi 的作用是存放处理后的数据的内存地址。​ 栈相关的寄存器有:SS、ebp、esp。其中 esp

2021-06-02 12:18:42 709

原创 函数与指针

文章目录0x01 函数指针0x02 指针函数0x03 函数名与 &0x01 函数指针​ 函数名即为函数地址,当指针中存放了函数地址,即为函数指针。​ 函数指针的定义有两种方法:int fun_c(int a){ pass; return 0;} //被指向的函数,fun_c 为该函数的地址/***方法一:**利用 typedef 定义函数指针的类型**然后利用这个函数指针类型定义函数指针*/typrdef int (*F)(int); //定义函

2021-06-01 15:54:45 51

原创 常量与指针

文章目录0x01 常量简介0x02 常量指针0x03 指针常量0x01 常量简介​ 广义上是指不变的量,虽然不完全正确,但很多时候,我们也确实可以这么理解。0x02 常量指针​ 常量指针可以理解为:一个指针,这个指针是一个常量,指针一旦被赋值就不可以改变。int * const p;/*** p 与 const 结合,再与 * 结合,所以看作常量指针** p 指向某内存地址,该地址不可被修改** 数组头的指针就是一个默认的常量指针*/0x03 指针常量​ 指针常量可以理解

2021-06-01 14:57:18 47

原创 文件操作初认识

文章目录0x01 文件简介0x02 文件系统0x03 文件类型0x04 文件打开0x05 文件读写0x06 读写指针0x01 文件简介​ 文件可以分为普通文件和设备文件。​ 普通文件存储在磁盘等外部设备中,需要时读入内存中。​ 设备文件,将外部设备也看作一个文件来进行管理,对外部设备的输入输出也等同于对文件的读写。0x02 文件系统​ 文件系统是指操作系统中用于组织和管理磁盘上文件的方法和数据结构,其负责文件的读取,修改,存储等等操作。​ Windows 上常见的文件系统有 FAT、

2021-05-31 17:19:05 74

原创 条件编译介绍

文章目录0x01 条件编译简介0x01 条件编译简介​ 在 C 语言的源代码中,可以通过一种方式规定代码是否会被编译进程序中,这种方式叫做条件编译。条件编译格式如下://格式一#ifdef macro_name //程序一,当标识符有定义程序一的代码将会被编译 pass;#else //程序二 pass;#endif//格式二#ifndef macro_name //ifndef 表示若没有定义 //程序一 pass; #else //程序二 pass;

2021-05-31 11:31:55 592

原创 宏——初认识

文章目录0x01 宏简介0x02 优缺点0x01 宏简介​ 宏定义是指用一个标志符代表一个字符串,该标志符就称为宏名。在程序编译预处理阶段,所有宏名将会被替换为宏定义中的字符串,这个操作被称为宏展开​ 定义格式如下:#define macro_name str //不带参数#define macro_name(argv) str //带参数//宏名一般大写,宏定义结尾处不需要使用分号结尾0x02 优缺点​ 宏定义有优点也有缺点有自解释性可以减少后期修改无法进行类型检查无

2021-05-30 23:28:03 110

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除