表填充算法
① 计算机图形学 活性边表填充算法的一道题求详细解答
ET表是记录每个顶点 AET表是每条线 比如y=4,5,6,7,8
② 利用WPS表格制作工资条成绩条
制作工资条、成绩单是周期性的重复劳动,单调乏味。对此,本文活用WPS表格的智能填充加巧妙算法,教你只用一次粘贴、一个公式、一次拖曳,搞定如图
1样式的条式单据。
图
1
完成图
言归正传,先操作,后解说。
1.
设定:
A表=原始工资表(见图
2)
B表=生成工资条的空白表
图
2
原始工资表
2.
操作步骤:
2.1.
粘贴A表表头到B表A1单元;
2.2.
选择与B表表头同宽度的下一行区域,键入以下公式后,按Ctrl+Enter填充所选区域①
并顺便设置框线。见图
3;
=Indirect("A表!"&Address((Row()+1)/3+1,Column()))
②
注意:若表头占两行,改公式中“3+1”
为“4+2”;若表头占三行,为“5+3“,依此类推③。
图
3
复制表头及录入公式
2.3.
选中B表表头,向下拉至数据所能呈现的行数,如公式计算所得,拉到行6。④(与表头同宽度),移动指针到所选区域右下角填充柄上(指针呈“十”),拖拽填充柄向下(见图
4),直到能呈现所有数据。截止行号=(表头占用行数+1)×记录条数。
图
4
分组填充
3.
技巧与算法:
①
组合键Ctrl+Enter——
能在相邻或不相邻的多个选定区域填充数据;
②
公式涉及4个函数,此例中:
Indirect(单元格引用文本)函数——
得到以文本表示的目标单元格值。可能的文本形如:"A表!$A$3"、"A表!$B$3"等;
Address(行号,列号)函数——得到数值代表的行列交叉单元的地址文本。结果貌似:"$A$3","B3";
Row(
)函数——返回该单元的行号;
Column(
)函数——返回该单元的列号;
③
算法思路:目的是将A表记录行{2,3,4,5,...}映射到B表记录行{2,5,8,11,....}。后者关联到索引(i)和表头行数(n),可表述为:B表第i行记录
=
(i+n+1)/(n+2)+n,而Row(
)
等效于i+n。
④
预留裁切区域,其空白行数,决定公式"(Row()+x)/y+1"
中x,y的取值;
若仍嫌繁复,可以到金山官方论坛(链接见下方),使用AutoIt工具集插件中的“生成工资条成绩条
”解决方案,仅需一次单击,完成所有任务(建表、记录填充、设置框线、智能分页、打印)
③ 学习计算机图形学的书籍介绍
目录
计算机图形学基础教程(Visual C++版)
第1章 导论1
1.1 计算机图形学的应用领域1
1.1.1 计算机辅助设计1
1.1.2 计算机艺术1
1.1.3 虚拟现实3
1.1.4 计算机辅助教学3
1.2 计算机图形学的概念4
1.3 计算机图形学的相关学科5
1.4 计算机图形学的确立和发展5
1.5 图形显示器的发展及其工作原理7
1.5.1 阴极射线管7
1.5.2 随机扫描显示器8
1.5.3 直视储存管显示器8
1.5.4 光栅扫描显示器9
1.5.5 液晶显示器13
1.5.6 等离子显示器15
1.5.7 三维显示器15
1.6 图形软件标准的形成18
1.7 计算机图形学的最新技术18
1.7.1 交互技术18
1.7.2 造型技术18
1.7.3 真实感图形显示技术19
1.8 小结19
习题119第2章 Visual C++6.0绘图基础21
2.1 面向对象程序设计基础21
2.1.1 类和对象21
2.1.2 构造函数和析构函数22
2.1.3 对象的动态建立和释放24
2.1.4 继承与派生25
2.2 MFC上机操作步骤28
2.3 基本绘图函数31
2.3.1 CDC类结构和GDI对象32
2.3.2 映射模式33
2.3.3 CDC类的主要绘图成员函数34
2.3.4 设备上下文的调用和释放50
2.3.5 VC++绘制图形的几种方法51
2.4 小结52
习题252第3章 基本图形的扫描转换55
3.1 直线的扫描转换55
3.1.1 算法原理56
3.1.2 构造中点偏差判别式56
3.1.3 递推公式57
3.2 圆的扫描转换57
3.2.1 算法原理58
3.2.2 构造中点偏差判别式59
3.2.3 递推公式60
3.3 椭圆的扫描转换60
3.3.1 算法原理61
3.3.2 构造上半部分I中点偏差判别式62
3.3.3 上半部分I的递推公式62
3.3.4 构造下半部分II中点偏差判别式64
3.3.5 下半部分II的递推公式64
3.4 反走样技术66
3.5 直线距离加权反走样算法67
3.5.1 算法原理67
3.5.2 构造距离判别式69
3.5.3 计算机化69
3.6 小结69
习题369第4章 多边形填充72
4.1 实面积图形的概念72
4.1.1 多边形的定义73
4.1.2 多边形的表示73
4.1.3 多边形的填充74
4.1.4 区域填充74
4.2 有效边表填充算法75
4.2.1 填充原理75
4.2.2 边界像素的处理原则75
4.2.3 有效边和有效边表76
4.2.4 边表79
4.3 边缘填充算法80
4.3.1 填充原理80
4.3.2 填充过程80
4.4 区域填充算法82
4.4.1 填充原理82
4.4.2 四邻接点和八邻接点82
4.4.3 四连通域和八连通域83
4.4.4 四邻接点填充算法和八邻接点填充算法84
4.5 小结85
习题485第5章 二维变换和裁剪89
5.1 图形几何变换基础89
5.1.1 规范化齐次坐标89
5.1.2 矩阵相乘89
5.1.3 二维变换矩阵90
5.1.4 二维几何变换90
5.2 二维图形基本几何变换矩阵91
5.2.1 平移变换矩阵91
5.2.2 比例变换矩阵91
5.2.3 旋转变换矩阵92
5.2.4 反射变换矩阵93
5.2.5 错切变换矩阵94
5.3 二维复合变换95
5.3.1 复合变换原理95
5.3.2 相对于任一参考点的二维几何变换95
5.3.3 相对于任意方向的二维几何变换96
5.4 二维图形裁剪98
5.4.1 图形学中常用的坐标系98
5.4.2 窗口和视区及窗视变换99
5.4.3 窗视变换矩阵100
5.5 Cohen-Sutherland直线裁剪算法101
5.5.1 编码原理101
5.5.2 裁剪步骤102
5.5.3 交点计算公式102
5.6 中点分割直线裁剪算法103
5.6.1 中点分割直线裁剪算法原理103
5.6.2 中点计算公式103
5.7 梁友栋-Barsky直线裁剪算法103
5.7.1 梁友栋算法原理103
5.7.2 算法分析104
5.7.3 算法的几何意义104
5.8 小结106
习题5106第6章 三维变换和投影108
6.1 三维几何变换108
6.1.1 三维变换矩阵108
6.1.2 三维几何变换108
6.2 三维基本几何变换矩阵109
6.2.1 平移变换109
6.2.2 比例变换109
6.2.3 旋转变换110
6.2.4 反射变换111
6.2.5 错切变换112
6.3 三维复合变换113
6.4 投影变换115
6.4.1 三视图115
6.4.2 斜等侧图118
6.5 透视变换120
6.5.1 透视变换坐标系120
6.5.2 坐标系变换121
6.5.3 用户坐标系到观察坐标系的变换122
6.5.4 观察坐标系到屏幕坐标系的变换124
6.5.5 透视投影分类125
6.6 小结127
习题6128第7章 自由曲线和曲面130
7.1 基本概念130
7.1.1 样条曲线曲面130
7.1.2 曲线曲面的表示形式130
7.1.3 拟合和逼近131
7.1.4 连续性条件131
7.2 三次参数样条曲线132
7.2.1 参数样条曲线定义132
7.2.2 系数求解133
7.2.3 边界条件133
7.3 Hermite样条曲线135
7.4 Bezier曲线137
7.4.1 Bezier曲线的定义137
7.4.2 Bezier曲线的性质139
7.4.3 Bezier曲线的可分割性139
7.5 Bezier曲面141
7.5.1 Bezier曲面的定义141
7.5.2 双三次Bezier曲面的定义141
7.6 B样条曲线142
7.6.1 B样条曲线的定义143
7.6.2 二次B样条曲线143
7.6.3 三次B样条曲线144
7.6.4 B样条曲线的性质146
7.6.5 构造特殊的三次B样条曲线的技巧148
7.7 B样条曲面149
7.7.1 B样条曲面的定义149
7.7.2 双三次B样条曲面的定义149
7.7.3 双三次B样条曲面的连续性150
7.8 小结152
习题7152第8章 分形几何156
8.1 分形和分维156
8.1.1 分形的诞生156
8.1.2 分形的基本特征157
8.1.3 分形的定义158
8.1.4 分形维数的定义158
8.2 递归模型160
8.2.1 Cantor集160
8.2.2 Koch曲线161
8.2.3 Peano-Hilbert曲线162
8.2.4 Sierpinski垫片、地毯和海绵164
8.2.5 C字曲线168
8.2.6 Caley树168
8.3 L系统模型169
8.3.1 L系统文法169
8.3.2 Koch曲线170
8.3.3 分形草171
8.3.4 Peano-Hilbert曲线171
8.3.5 分形灌木丛173
8.4 IFS迭代函数系统模型174
8.4.1 仿射变换174
8.4.2 IFS175
8.4.3 Koch曲线178
8.4.4 Sierpinski垫片180
8.4.5 枫叶生成182
8.5 小结183
习题8183第9章 动态消隐187
9.1 图形的数据结构187
9.1.1 图形的几何信息和拓扑信息187
9.1.2 基本图形的数据结构187
9.1.3 立体表示模型188
9.2 消隐算法分类190
9.3 隐线算法190
9.3.1 凸多面体消隐算法190
9.3.2 曲面体消隐算法192
9.4 隐面算法194
9.4.1 Z-Buffer算法194
9.4.2 画家算法197
9.5 小结198
习题9198第10章 真实感图形201
10.1 颜色模型201
10.1.1 基本概念201
10.1.2 RGB颜色模型202
10.1.3 Gouraud颜色渐变203
10.2 材质模型和光照模型205
10.2.1 物体的材质205
10.2.2 环境光模型206
10.2.3 漫反射光模型206
10.2.4 镜面反射光模型207
10.2.5 光强的衰减208
10.3 纹理映射209
10.3.1 纹理定义209
10.3.2 纹理映射210
10.4 OpenGL简介210
10.4.1 案例效果210
10.4.2 TestView.h文件210
10.4.3 TestView.cpp文件213
10.4.4 程序说明220
10.5 小结222
习题10222附录A 配套实践教程的案例设置及与本书的对应关系225
④ 填充算法的注入填充区域算法
注入填充算法(FloodFill Algorithm)用于内部定义区域,以改变整个区域的颜色属性,它把区域内的原像素点值改变成另一种像素点值。算法3.2用于填充八连通的内部定义区域。算法中,read ¡ pixel(x; y)表示读出像素点(x; y)像素点值。old-value为像素点的原值, new-value为将要填充的新值。
[算法3.2] 注入填充区域算法。
Procere flood-fill-8(x,y,old-value,new-value)
BEGIN
IF read-pixel(x,y)=old-value THEN
BEGIN
write-pixel(x,y,new-value)
flood-fill-8(x,y-1,old-value,new-value)
flood-fill-8(x,y+1,old-value,new-value)
flood-fill-8(x-1,y,old-value,new-value)
flood-fill-8(x+1,y,old-value,new-value)
flood-fill-8(x+1,y-1,old-value,new-value)
flood-fill-8(x+1,y+1,old-value,new-value)
flood-fill-8(x-1,y-1,old-value,new-value)
flood-fill-8(x-1,y+1,old-value,new-value)
END
ENDIF
END
此算法所采用的基本方法是首先确定(x; y)点的像素点是否在区域内尚未被访问过的那一部分之中,也就是说,如果这个像素点的值是原始值old-value,则需要把它改为填充的值new-value,然后按八连通区域性质先后访问其八个相邻的像素点,当访问其中每一个近邻像素点时,都要进行递归调用。此算法通过在四个方向而不是八个方向上扩展,就可以用来填充一个内部定义的四连通式区域。这时程序只要有前面四个flood-fill-8(...)语句就可以了.
⑤ 比较边界填充算法和泛填充算法的异同
现代设计方法与传统设计方法区别(1)直觉设计阶段古代的设计是一种直觉设计。当时人们或是从自然现象中直接得到启示,或是全凭人的直观感觉来设计制作工具。设计方案存在于手工艺人头脑之中,无法记录表达,产品也是比较简单的。直觉设计阶段在人类历史中经历了一个很长的时期,17世纪以前基本都属于这一阶段。(2)经验设计阶段随着生产的发展,单个手工艺人的经验或其头脑中的构思已很难满足这些要求。于是,手工艺人联合起来,互相协作。一部分经验丰富的手工艺人将自己的经验或构思用图纸表达出来,然后根据图纸组织生产。图纸的出现,即可使具有丰富经验的手工艺人通过图纸将其经验或构思记录下来,传与他人,便于用图纸对产品进行分析、改进和提高,推动设计工作向前发展;还可满足的人同时参加同一产品的生产活动,满足社会对产品的需求及提高生产率的要求。因此,利用图纸进行设计,使人类设计活动由直觉设计阶段进入到经验设计阶段。(3)半理论半经验设计阶段20世纪以来,由于科学和技术的发展与进步,设计的基础理论研究和实验研究得到加强,随着理论研究的深入、实验数据及设计经验的积累,已形成了一套半经验半理论的设计方法。这种方法以理论计算和长期设计实践而形成的经验、公式、图表、设计手册等作为设计的依据,通过经验公式、近似系数或类比等方法进行设计。依据这套方法进行机电产品设计,称为传统设计。所谓“传统”是指这套设计方法已延用了很长时间,直到现在仍被广泛地采用着。传统设计又称常规设计。(3)现代设计阶段近30年来,由于科学和技术迅速发展,对客观世界的认识不断深入,设计工作所需的理论基础和手段有了很大进步,特别是电子计算机技术的发展及应用,对设计工作产生了革命性的突变,为设计工作提供了实现设计自动或和精密计算的条件。例如CAD技术能得出所需要的设计计算结果资料、生产图纸和数字化模型,一体化的CAD/CAM技术更可直接输出加工零件的数控代码程序,直接加工出所需要的零件,从而使人类设计工作步入现代设计阶段。此外,步入现代设计阶段的另一个特点就是,对产品的设计已不是仅考虑产品本身,并且还要考虑对系统和环境的影响;不仅要考虑技术领域,还要考虑经济、社会效益;不仅考虑当前,还需考虑长远发展。例如,汽车设计,不仅要考虑汽车本身的有关技术问题,还需考虑使用者的安全、舒适、操作方便等。此外,还需考虑汽车的燃料供应和污染、车辆存放、道路发展等问题。传统设计是以经验总结为基础,运用长期设计实践和理论计算而形成的经验、公式、图表、设计手册等作为设计的依据,通过经验公式、近似系数或类比等方法进行设计。传统设计在长期运用中得到不断完善和提高,是符合当代技术水平的有效设计方法。分析传统的设计过程,可以看出传统设计的每一个环节都是依靠设计者用手工方式来完成的。首先凭借设计者直接的或间接的经验,通过类比分析或经验公式来确定方案,由于方案的拟定很大程度上取决于设计人员的个人经验,即使同时拟定几个方案,也难于获得最优方案。由于分析计算受人工计算条件的限制,只能用静态的、近似的方法,参考数据偏重于经验的概括和总结,往往忽略了一些难解或非主要的因素,因而造成设计结果的近似性较大,有时不符合客观实际。此外,信息处理、经验或知识的存储和重复使用方面还没有一个理想的有效方法,解算和绘图也多用手工完成,这不仅影响设计速度和设计质量的提高,也难以做到精确和优化的效果。传统设计对技术与经济、技术与美学也未能做到很好的统一,使设计带有一定的局限性。这些都是有待于进一步改进和完善之处。总之,传统设计方法是一种以静态分析、近似计算、经验设计、手工劳动为特征的设计方法。显然随着现代科学技术的飞速发展、生产技术的需要和市场的激烈竞争以及先进设计手段的出现,这种传统设计方法已难以满足当今时代的要求,从而迫使设计领域不断研究和发展新的设计方法和技术。现代设计是过去长期的传统设计活动的延伸和发展,是传统设计的深入、丰富和完善。随着设计实践经验的积累,设计理论的发展以及科学技术的进步,特别是计算机技术的高速发展,设计工作包括机械产品的设计过程产生了质的飞跃。为区别过去常用的传统设计理论与方法,人们把这些新兴理论与方法称为现代设计。“现代设计技术”就是以满足市场产品的质量、性能、时间、成本、价格综合效益最有为目的,以计算机辅助设计技术为主体,以知识为依托,以多种科学方法及技术为手段,研究、改进、创造产品活动过程所用到的技术群体的总称。现代设计不仅指设计方法的更新,也包含了新技术的引入和产品的创新。目前现代设计方法所指的新兴理论与方法主要包括优化设计、可靠性设计、设计方法学、计算机辅助设计、动态设计、有限元法、工业艺术造型设计、人机工程、并行工程、价值工程、反求工程设计、模块化设计、相似性设计、虚拟设计、疲劳设计、三次设计、摩擦学设计、绿色设计等。现代设计与传统设计的关系如下。①继承关系。现代设计是过去长期的传统设计活动的延伸和发展,它继承了传统设计的精华,克服了传统设计的一些不足。②共存于突破的关系。设计方法的发展,都有着时序性、继承性,两种方法在一定时间内还会共存。当前的现代设计方法正处在发展之中,可以预见,随着科学技术的进步必将有新的突破。传统设计以经验、试凑、静态、定性分析、手工劳动为特征,导致设计周期长,设计质量差,设计费用高,产品缺乏竞争力。随着现代科学技术的发展,机械产品设计领域中相继出现了一系列新型理论与方法。这些新兴理论与方法统称为现代设计方法。现代设计主要有下列特点。(1)系统性现代设计方法是逻辑的、系统的设计方法。目前有两种体系:一种是德国倡导的设计方法学,用从抽象到具体的发散的思维方法,以“功能—原理—结构”框架为模型的横向变异和纵向综合,用计算机构造多种方案,评价决策选出最优方案。另一种是美国倡导的创造性设计学,在知识、手段和方法不充分的条件下,运用创造技法,充分发挥想象,进行辩证思维,形成新的构思和设计。传统设计方法是经验、类比的设计方法,用收敛性的思维方法,过早地进入具体方案,对功能原理的分析既不充分又不系统,不强调创新,也很难得到最优方案。(2)社会性现代设计将产品设计扩展到整个产品生命周期,发展了“面向X”技术,即在设计过程中同时考虑制造、维修、成本、包装、运输、回收、质量等因素。在现代设计开发新产品的整个过程中,从产品的概念形成到报废处理的全寿命周期中的所有问题,都要以面向社会、面向市场为主导思想考虑解决。设计过程中的功能分析、原理方案确定、结构方案确定、造型方案确定,都要随时按市场经济规律进行尽可能定量的市场分析、经济分析、价值分析。现代设计要求,以并行工程方法指导企业生产管理体制的改革和新产品设计工作,以相似性设计、模块化设计来更好地满足广泛的变化的社会需求,以反求工程技术消化、应用国际先进技术,以摩擦学设计方法来提高机械效率,已三次设计方法来有效地提高产品性能价格比。传统设计是由技术主管指导设计,设计过程中多为单纯注意技术性,设计产品试制后才进行经济分析、成本核算,很少考虑社会问题。(3)创造性现代设计强调激励创造冲动,突出创新意识,力主抽象的设计构思,扩展发散的设计思维、多种可行的创新方案,广泛深入地评价决策,集体运用创造技法,搜索创新工艺试验,不断要求最优方案。传统设计一般是封闭收敛的设计思维,陷入思维定势,过早地进入定型实体结构,采用经验类比和直接主官的评价决策。(4)宜人性现代设计强调产品内在质量的实用性,外观形体的美观性、艺术性和时代性,在保证产品物质功能的前提下,尽量使用户产生新颖舒畅等精神感受。他要求从人的生理和心理特征出发,通过功能分析、界面安排和系统综合,满足人一机一环境等之间的协调关系,发挥系统潜力,提高效率。工业艺术造型设计和人机工程提高了产品的精神功能,不断满足宜人性要求。传统设计往往强调产品的物质功能,忽视或不全面考虑精神功能,而仅凭经验或自发地考虑人一机一环境之间的关系,强调训练用户来适应机器的要求。(5)最优化现代设计重视综合集成,在性能、技术、经济、制造工艺、使用、环境、可持续发展等各种约束条件之下,在广泛的学科领域之间,通过计算机以高效率综合集成为最新科技成果,寻求最优方案和参数。它利用优化设计、人工神经网络算法和工程遗传算法等求出各种工作条件下的最优解。传统设计属于自然优化,在设计—评定—再设计的循环中,凭借设计人员的有限知识、经验和判断力选取较好方案,因而受任何效率的限制,难以对多变量系统在广泛影响因素下进行定量优化。(6)动态化现代设计在静态分析的基础上,考虑生产中实际存在的多种变化量(如产品工作可靠性问题中的考虑载荷谱、负载率等随机变量)的影响,进行动态特性的最优化,根据概率论和统计学方法,针对载荷、应力等因素的离散性,用各种运算方法进行可靠性设计,对一些复杂的工程分析问题还可用有限元法、边界元法等数值解法得到满意的结果。传统设计以静态分析和少变量为主。如机械学中将载荷、应力等因素做集中处理,由此考虑安全系数,这与实际工况相差较远。(7)设计过程智能化这是指借助于人工智能和专家系统技术,由计算机完成一部分原来必须由设计者进行的创造性工作。现代设计认为,各种生物在自己的某些领域里具有极高的水平。仿生学研究如何模仿生物的某些高水平的能力。由于生物中人的只能最高,人能通过知识和信息的获取、推理和运用,解决极复杂的问题。在已被认识的人的思维规律的基础上,在智能工程理论的指导下,以计算机为主模仿人的职能活动,能够设计出高度智能化的产品和系统。传统设计局部上自发地运用某些仿生规律,但这很难达到高度智能化的要求。(8)设计手段的计算机化和数字化计算机在设计中的应用已从早期的辅助分析、计算机绘图,发展到现在的优化设计、并行设计、三维建模、设计过程管理、设计制造一体化、仿真和虚拟制造等。特别是网络和数据库技术的应用,加速
⑥ aes算法填充方式
NoPadding,PKCS5Padding,ISO10126Padding,PaddingMode.Zeros,PaddingMode.PKCS7。
aes算法基本介绍
AES技术是一种对称的分组加密技术,使用128位分组加密数据,提供比WEP/TKIPS的RC4算法更高的加密强度。AES的加密码表和解密码表是分开的,并且支持子密钥加密,这种做法优于以前用一个特殊的密钥解密的做法。AES算法支持任意分组大小,初始时间快。特别是它具有的并行性可以有效地利用处理器资源。
⑦ 计算机图形学 C#区域填充
填充算法满复杂的,常用的有活动边表填充,我以前也尝试用c#做图形学的程序。现在假设你知道填充算法,需要注意的是,c#中Graphics类没有setPixel()方法。你需要创建一个image(位图)对象,在位图中进行填充,然后再用Graphics类中的setImage()方法将位图显示在屏幕中。大概是这样,时间很长了,里面一些方法可能不太对,详细你查msdn,祝你成功!
⑧ PHP对称加密-AES
对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇: Mcrypt 和 OpenSSL 。
其中 Mcrypt 在 PHP 7.1.0 中被弃用(The Function Mycrypt is Deprecated),在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密。
在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性。
下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC 加解密,二者同步加解密的要点为:
协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密。
AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了。
AES 有三种算法,主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥 key
AES-192:需要提供 24 位的密钥 key
AES-256:需要提供 32 位的密钥 key
AES 是按数据块大小(128/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景,这时就需要填充数据长度到加密算法对应的数据块大小。
主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充,这样在一定程度上亲和了 OpenSSL 加密算法)。
Mcrypt 的默认填充算法。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 " ",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 " " 手动拼接也是可以的。
OpenSSL的默认填充算法。下面我们给出 PKCS7 填充算法 PHP 的实现:
默认使用 NUL(" ") 自动对待加密数据进行填充以对齐加密算法数据块长度。
获取 mcrypt 支持的算法,这里我们只关注 AES 算法。
注意:mcrypt 虽然支持 AES 三种算法,但除 MCRYPT_RIJNDAEL_128 外, MCRYPT_RIJNDAEL_192/256 并未遵循 AES-192/256 标准进行加解密的算法,即如果你同其他系统通信(java/.net),使用 MCRYPT_RIJNDAEL_192/256 可能无法被其他严格按照 AES-192/256 标准的系统正确的数据解密。官方文档页面中也有人在 User Contributed Notes 中提及。这里给出如何使用 mcrpyt 做标注的 AES-128/192/256 加解密
即算法统一使用 MCRYPT_RIJNDAEL_128 ,并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位,便于统一对齐),mode 选用的 CBC 模式。
mcrypt 在对数据进行加密处理时,如果发现数据长度与使用的加密算法的数据块长度未对齐,则会自动使用 " " 对待加密数据进行填充,但 " " 填充模式已不再被推荐,为了与其他系统有更好的兼容性,建议大家手动对数据进行 PKCS7 填充。
openssl 簇加密方法更为简单明确,mcrypt 还要将加密算法分为 cipher + mode 去指定,openssl 则只需要直接指定 method 为 AES-128-CBC,AES-192-CBC,AES-256-CBC 即可。且提供了三种数据处理模式,即 默认模式 0 / OPENSSL_RAW_DATA / OPENSSL_ZERO_PADDING 。
openssl 默认的数据填充方式是 PKCS7,为兼容 mcrpty 也提供处理 "0" 填充的数据的模式,具体为下:
options 参数即为重要,它是兼容 mcrpty 算法的关键:
options = 0 : 默认模式,自动对明文进行 pkcs7 padding,且数据做 base64 编码处理。
options = 1 : OPENSSL_RAW_DATA,自动对明文进行 pkcs7 padding, 且数据未经 base64 编码处理。
options = 2 : OPENSSL_ZERO_PADDING,要求待加密的数据长度已按 "0" 填充与加密算法数据块长度对齐,即同 mcrpty 默认填充的方式一致,且对数据做 base64 编码处理。注意,此模式下 openssl 要求待加密数据已按 "0" 填充好,其并不会自动帮你填充数据,如果未填充对齐,则会报错。
故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:
建议将源码复制到本地运行,根据运行结果更好理解。
1.二者使用的何种填充算法。
2.二者对数据是否有 base64 编码要求。
3.mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,并通过调整 key 的长度 16, 24,32 来实现 ase-128/192/256 加密算法。
⑨ 微软操作系统:自带的画图工具填充是用什么算法实现的
基于扫描线的洪水填充算法
洪水填充算法 慢在需要检查周边4个点,而如果带上方向,则刚处理过的点是不需要再判断的了
如果维持算法的一致,那么步长可以增加到 3
如果采用多线程处理,则每个线程只处理一根扫描线,且只检查前进方向的一个点
⑩ 简单扫描线性填充和与边相关扫描线填充算法的区别
1. 对多边形的每一条边进行扫描转换,即对 多边形边界所经过的象素作一个边界标志。 2.填充。对每条与多边形相交的扫描线,按 从左到右的顺序,逐个访问该扫描线上的象 素。 取一个布尔变量inside来指示当前点的状态, 若点在多边形内,则inside为真。若点在多 边形外,则inside为假。 Inside 的初始值为假,每当当前访问象素为 被打上标志的点,就把inside取反。对未打 标志的点,inside不变。