當前位置:首頁 » 操作系統 » 表填充演算法

表填充演算法

發布時間: 2022-12-31 06:23:50

① 計算機圖形學 活性邊表填充演算法的一道題求詳細解答

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不變。

熱點內容
美團抵用密碼在哪裡看 發布:2025-05-10 12:31:15 瀏覽:933
sql資料庫查詢語句大全 發布:2025-05-10 12:29:41 瀏覽:418
微信點餐小程序源碼 發布:2025-05-10 12:23:57 瀏覽:477
c語言讀寫結構體 發布:2025-05-10 12:19:16 瀏覽:490
這是什麼狗上傳圖片 發布:2025-05-10 12:02:59 瀏覽:122
教小朋友編程 發布:2025-05-10 12:01:29 瀏覽:635
qq號怎麼申請賬號和密碼忘了怎麼辦啊 發布:2025-05-10 12:00:42 瀏覽:200
油冷冰箱壓縮機 發布:2025-05-10 12:00:40 瀏覽:898
四川新社保卡密碼是多少 發布:2025-05-10 11:56:06 瀏覽:764
資料庫沉余 發布:2025-05-10 11:38:37 瀏覽:67