结构体类型

Nginx:解析HTTP配置的流程

杀马特。学长 韩版系。学妹 提交于 2020-01-14 04:52:25
参考资料:深入理解Nginx(陶辉) 书中有详细的讲解,这里只用本人的理解梳理一下该流程。 一点提议 :对于像我这样的新手,面对暂时看不懂章节,建议先往下看一下(可能就会有新的理解或灵感),而不要死磕在某一章节。 几个重要的数据结构 定义一个用于测试的结构体 我们的测试模块将使用该结构体来存放配置信息,该结构只存放一个ngx_str_t。 typedef struct {   ngx_str_t my_str; } ngx_http_mytest_conf_t; 先看看ngx_http_module_t的定义 typedef struct {   ngx_int_t (*preconfiguration)(ngx_conf_t *cf); //解析配置文件前调用   ngx_int_t (*postconfiguration)(ngx_conf_t *cf); //完成配置文件解析后调用   void *(*create_main_conf)(ngx_conf_t *cf); //当需要创建数据结构用户存储main级别的全局配置项时候调用   char *(*init_main_conf)(ngx_conf_t *cf, void *conf); //初始化main级别配置项   void *(*create_srv_conf)(ngx_conf_t *cf); /

IDA Pro7.0使用技巧总结

三世轮回 提交于 2020-01-13 21:46:04
俗话说,工欲善其事,必先利其器,在二进制安全的学习中,使用工具尤为重要,而IDA又是玩二进制的神器,以前在使用IDA的时候,只是用几个比较常用的功能,对于IDA的其他功能没有去研究,于是本着学习的精神,参考着《IDA pro权威指南》(第二版),写下这篇文章,记录自己的学习心得,下面的记录都是在Windows平台下的IDA pro7.0进行的 一些二进制工具 在《IDA pro权威指南》的开篇一两章中,先是介绍了几款常用于二进制研究的工具,我这里简单的记了几个,介绍一波: C++filt: 可以用于显示出c++中复杂的重载后的函数名称 PE tools: 是一组用于分析Windows系统中正在运行的进程和可执行文件的工具 string: 可以用于直接搜索出elf文件中的所有字符串 参数-a 表示搜索整个文件,参数-t 可以显示出每一个字符串的偏移,参数-e 可以用于搜索更多的字符编码的字符串,如Unicode编码 strip: 可用于elf去符号,去符号后仍然保持正常功能但增加了逆向的难度,出题恶人必备 开发了IDA的天才是Ilfak,他的个人博客有很多IDA的教程 https://www.hexblog.com/ IDA目录结构 在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容 cfg:包含各种配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui

Go 基础语法

只谈情不闲聊 提交于 2020-01-13 03:05:02
转自:http://studygolang.com/topics/548 例子Packages.go: package main import ( "fmt" "math/rand" ) func add(x int, y int) int { return x + y } func main() { fmt.Println("My favorite number is", rand.Intn(10)) fmt.Println(add(42, 13)) } 包:每个 Go 程序都是由包(package)组成的,程序运行的入口是包 main 。 导入:这个代码用圆括号组合了导入,这是“打包”导入语句。同样可以编写多个导入语句,例如: import "fmt" import "math" 这个程序使用并导入了包 "fmt" 和" math/rand" 。包名与导入路径的最后一个目录一致。例如,如果你导入了" math/rand" ,那么你就可以在程序里面直接写rand.Intn(10),但如果你导入的是" math" ,那么你就得写math.rand.Intn(10)。 函数:函数可以没有参数或接受多个参数。在这个例子中, add 接受两个 int 类型的参数,注意类型在变量名之后。有没有觉得很奇怪呢,下面就详细解释一下go这样做的原因。 看一个c的例子: int (*fp)(int

Android JNI(一)——NDK与JNI基础

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-11 06:54:02
前言 ndk开发是高级Android 开发必备的技能,也是很多Android开发工程师难以逾越的门槛,因此,学习ndk开发已经是高级Android必备技能,所以我尝试把自己ndk开发经验记录下来,不知之处,请大家多做指教。 导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。大家都知道SDK是基于Java开发的,ndk则是基于C/C++。不过,Android 平台从一开就已经支持了C/C++了。Google从一开始就说明Android也支持JNI编程方式,也就是第三方应用完成可以通过JNI调用自己的C动态度。于是NDK就应运而生了。 你可以从Google官方查阅到有许多关于SDK的优秀书籍、文章作为参考,但是Google提供的NDK资源,相对于SDK还是比较少的。本系列文章主要是用于,自己记录自学NDK的经验,并且希望能够帮助到哪些想学习NDK的朋友。 好了,下面我们一步一步的认识SDK吧。 了解什么是ndk 为什么使用NDK NDK到SO JNI的调用 什么是NDK NDK 其中NDK的全拼是:Native Develop Kit。我们可以去官网查看 Android NDK 具体的介绍,大致意思如下图: 英文意思如下: The Android NDK is a toolset that lets you implement parts of

【Nginx】如何应对HTTP组态

人盡茶涼 提交于 2020-01-11 00:13:59
相同的配置项可以在相同的时间内发生的多个块。例如HTTP片、server片、location片。阻断取之于在配置项值。 处理HTTP配置项分下面4个步骤: 创建数据结构用于存储配置项相应的參数 设定配置项在配置文件里出现时的限制条件与回调方法 实现上述回调方法,或使用Nginx预设的14个回调方法 合并不同级别的同名配置项 1、分配用于保存配置參数的数据结构 创建一个结构体,用来保存感兴趣的參数。比如定义一个以下的结构体: typedef struct { ngx_str_t my_str; ngx_int_t my_num; ngx_flag_t my_flag; size_t my_size; ngx_array_t* my_str_array; ngx_array_t* my_keyval; off_t my_off; ngx_msec_t my_msec; time_t my_sec; ngx_bufs_t my_bufs; ngx_uint_t my_enum_seq; ngx_uint_t my_bitmask; ngx_uint_t my_access; ngx_path_t* my_path; ngx_str_t my_config_str; ngx_int_t my_config_num; } ngx_http_mytest_conf_t;

c中结构体数据对齐问题

百般思念 提交于 2020-01-10 14:07:34
1.为什么需要数据对齐 提升CPU读取数据的效率。CPU每次都是从以4字节(32位CPU)或是8字节(64位CPU)的整数倍的内存地址中读进数据的(例如32位的只能0x00000004、0x00000008这种地址一次读4字节的数据)。如果数据不对齐,例如一个int类型放在0x00000004、0x00000008这两个内存地址中间,CPU就会多次读取,如果把整形对齐存放在0x00000008就可以一次读取出来。 2.分析(编译器:Dev 电脑:64位) 我们用创建结构体然后用sizeof打印出结构体大小方式来验证数据对齐方式 正式开始,定义一个char和int,如果不对齐sizeof的结果应该是5,看结果 结果是8,将char于int类型补齐,即对char补齐了3个字节。结果是(1+ 3 )+4=8. (注:所有计算试中斜体加粗数据为补齐用) 如果再往后面添加一个数据呢? 依旧会将最后一个char进行数据对齐,结果为(1+ 3 )+4+(1+ 3 )=12 我们将c换到中间去,结果是否还是12呢? 结果变成了8,原因是a和c所需的空间为2,不需要各自补齐3个空间。结果为((1+1)+ 2 )+4=8 那对字符数组呢? 把a[5]直接拆开成5个char类型即可,结果为((1+1+1+1+1)+ 3 )+4=12. 可以做一个小结: 可以发现,

C语言基础--结构体对齐,位域,联合体

末鹿安然 提交于 2020-01-10 03:57:53
结构体对齐 1--结构体对齐的原因与意义 许多计算机系统对基本数据类型的可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值K(通常是2,4,8)的倍数,而这个k则被称为该数据类型的对齐模数(alignment modulus)。这种对其限制不仅简化了处理器与存储系统之间的接口的硬件设计,而且提高了存储系统的性能。 2 -- 结构体对齐包括两个方面的含义 1)结构体总长度 2)结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置 3--不同编译器的对其策略 1)Linux沿用的对其策略是2字节的数据类型(例如short)的地址必须是2的倍数,而更大的数据类型(如int,double)的地址必须是4的倍数。 2)Windows对齐要求更要严格些,任何K字节(基本)对象的地址都必须是k的倍数。 4 -- 结构体大小的计算方法和步骤 1)将结构体内所有数据成员的长度值相加,记为sum_a; 2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack指定的数值以及该数据成员自身长度中数值较小者。该数据相对起始位置应该是对齐模式的整数倍; 3)将和sum_b向结构体模数对齐,该模数是#pragma pac指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者。结构体的长度应该是该模数的整数倍.

结构体练习题二

﹥>﹥吖頭↗ 提交于 2020-01-10 01:49:06
练习题一 1、定义一个结构体Monster,能够存储怪的各种信息(至少有一个成员是结构体类型)。 2、声明一个Monster类型的数组,长度为10. 3、编写一个函数,为第二题中的数组赋值. 4、编写一个函数,能够通过怪物ID,打印当前这个怪物的所有信息. // hele.cpp : Defines the entry point for the console application. // #include "stdafx.h" //定义一个坐标结构体 struct coordinate { float x; float y; float h; }; //定义一个游戏怪物结构体,使用上面的坐标结构体 struct Monster { int id; int Life_value; int Magic_value; int Grade; int Aggressivity; coordinate position; }; //声明一个Monster的结构体数组tianlong长度为10 Monster tianlong[10]; //声明一个结构体变量时要放在定义结构体的后面调用了这个结构体的函数前面。 //通过循环给结构体全部赋值 void Function() { int i; for(i=0; i<10; i++) { tianlong[i].id = i+1;

C 结构体位域

不羁的心 提交于 2020-01-09 20:56:19
位域 : 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。 位段成员必须声明为int、unsigned int或signed int类型(short char long)。 一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 例如: struct bs { int a:8; int b:2; int c:6; }; 位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: struct bs { int a:8; int b:2; int c:6; }data; View Code 说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 1. 如果一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域

C结构体之位域(位段)

谁说我不能喝 提交于 2020-01-09 05:02:06
几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存对齐全攻略–涉及位域的内存对齐原则 本文主要对位域相关知识进行了一下梳理,参考如下: C语言中的位域 史上最全的C位域总结 2 C结构体之位域(位段) C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。 位域的作用主要是节省内存资源,使数据结构更紧凑。 1. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。 如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct BitField { unsigned int a:4; //占用4个二进制位; unsigned int :0; //空位域,自动置0; unsigned int b:4; //占用4个二进制位,从下一个存储单元开始存放; unsigned int c:4; //占用4个二进制位; unsigned int d:5; //占用5个二进制位,剩余的4个bit不够存储4个bit的数据,从下一个存储单元开始存放; unsigned int :0; //空位域,自动置0; unsigned int e:4; /