适用环境:powerbuilder 10.0以后的版本号  window server2003以后的測试可用

PB也能够调用系统自带的DLL 实现MD5

当中md5file对大附件的处理速度也比第三方组件快一些

这里能够去下载附件

  1. //调用例子:
  2. u_derek_md5 lu_md5
  3. lu_md5=create u_derek_md5
  4. string ls_text="123"
  5. string ls_result,ls_ret
  6. string ls_filepath="C:\1.txt"
  7.  
  8. //对字符串进行md5
  9. lu_md5.uf_md5string(ls_text,ref ls_result)
  10. messagebox('',ls_result)
  11.  
  12. //对文件进行md5,大附件的处理速度也比第三方组件快
  13. ls_ret=lu_md5.uf_md5file(ls_filepath,ref ls_result)
  14. if ls_ret<>'' then //返回非空为失败
  15. messagebox('',ls_ret)
  16. else
  17. messagebox('',ls_result)
  18. end if
  19.  
  20. destroy lu_md5
  1. forward
  2. global type u_derek_md5 from nonvisualobject
  3. end type
  4. type md5_ctx from structure within u_derek_md5
  5. end type
  6. end forward
  7.  
  8. type md5_ctx from structure
  9. byte a[8]
  10. byte b[16]
  11. byte c[64]
  12. byte d[16]
  13. end type
  14.  
  15. shared variables
  16.  
  17. end variables
  18. global type u_derek_md5 from nonvisualobject
  19. end type
  20. global u_derek_md5 u_derek_md5
  21.  
  22. type prototypes
  23.  
  24. FUNCTION long OpenProcess(long dwDesiredAccess,long bInheritHandle,long dwProcessId) LIBRARY "kernel32.dll" ALIAS FOR "OpenProcess;ansi"
  25. Function boolean CloseHandle (long hObject ) Library "kernel32" Alias for "CloseHandle;ansi"
  26.  
  27. FUNCTION ulong CreateFile(ref string lpFileName,ulong dwDesiredAccess,ulong dwShareMode,ref ulong lpSecurityAttributes[3],ulong dwCreationDisposition,ulong dwFlagsAndAttributes,ulong hTemplateFile) LIBRARY "kernel32.dll" ALIAS FOR "CreateFileA;ansi"
  28. Function ulong CreateFileMapping (ulong hFile ,ulong lpFileMappigAttributes[3], ulong flProtect , ulong dwMaximumSizeHigh , ulong dwMaximumSizeLow ,ref String lpName ) Library "kernel32" Alias for "CreateFileMappingA;ansi"
  29. Function ulong OpenFileMapping(ulong dwDesiredAccess , boolean bInheritHandle ,ref string lpName) Library "kernel32" Alias for "OpenFileMappingA;ansi"
  30. Function ulong MapViewOfFile (ulong hFileMappingObject , ulong dwDesiredAccess , ulong dwFileOffsetHigh , ulong dwFileOffsetLow , ulong dwNumberOfBytesToMap ) Library "kernel32"Alias for "MapViewOfFile"
  31. SUBROUTINE UnmapViewOfFile (ulong lpBaseAddress ) Library "kernel32" alias for "UnmapViewOfFile;ansi"
  32.  
  33. SUBROUTINE MD5Init (ref md5_ctx lpContext ) Library "cryptdll.dll" alias for "MD5Init;ansi"
  34. SUBROUTINE MD5Final (ref md5_ctx lpContext ) Library "cryptdll.dll" alias for "MD5Final;ansi"
  35. SUBROUTINE MD5Update (ref md5_ctx lpContext ,ulong lpBuffer,ulong BufSize ) Library "cryptdll.dll" alias for "MD5Update;ansi"
  36. SUBROUTINE MD5Update (ref md5_ctx lpContext,blob lpBuffer,ulong BufSize ) Library "cryptdll.dll" alias for "MD5Update;ansi"
  37.  
  38. end prototypes
  39.  
  40. type variables
  41.  
  42. CONSTANT ulong GENERIC_READ=2147483648
  43. CONSTANT ulong FILE_SHARE_READ=1
  44. CONSTANT ulong OPEN_EXISTING=3
  45. CONSTANT ulong FILE_ATTRIBUTE_NORMAL=128
  46. CONSTANT ulong PAGE_READONLY=2
  47. CONSTANT ulong FILE_MAP_READ=4
  48.  
  49. end variables
  50.  
  51. forward prototypes
  52. public function string uf_md5file (ref string ls_filename, ref string ls_result)
  53. public function string uf_md5string (ref blob ls_string, ref string ls_result)
  54. public function string decto (decimal ad_dec, readonly unsignedinteger aui_sys)
  55. public function integer hexencode (ref byte lb_array[], ref character lc_result[])
  56. public function string uf_md5string (ref string ls_string, ref string ls_result)
  57. end prototypes
  58.  
  59. public function string uf_md5file (ref string ls_filename, ref string ls_result);ulong l_size
  60. ulong l_hfile,l_hmap,l_pAddr
  61. long l_ret
  62. ulong l_Secu[3]
  63. md5_ctx lpContext
  64. char lc_result[]
  65. byte lbyte_result[]
  66. string ls_ref,ls_errtext
  67. boolean lb_ret
  68.  
  69. ls_result=''
  70. ls_filename=string(ls_filename,'')
  71.  
  72. if DirectoryExists ( ls_filename )=true then
  73. ls_errtext='不能是目录!' //+string(ls_filename)+'~r~n'
  74. goto e
  75. end if
  76.  
  77. if fileexists(ls_filename)=false then
  78. ls_errtext='文件不存在!' //+string(ls_filename)+'~r~n'
  79. goto e
  80. end if
  81.  
  82. l_size=FileLength ( ls_filename )
  83. if l_size=-1 then
  84. ls_errtext='FileLength:'+string(l_size)+'~r~n'
  85. goto e
  86. end if
  87.  
  88. if l_size=0 then
  89. ls_errtext='文件内容不能为空:'+string(l_size)+'~r~n'
  90. goto e
  91. end if
  92.  
  93. if l_size>2*645*1024*1024 then //最大支持
  94. ls_errtext='最大支持:'+string(2*645*1024*1024,'###,###,##0')+'~r~n'
  95. goto e
  96. end if
  97.  
  98. try
  99.  
  100. l_hfile=CreateFile(ls_filename,GENERIC_READ,FILE_SHARE_READ,l_Secu[],OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
  101. if l_hfile<=0 then
  102. ls_errtext='CreateFile:'+string(l_hfile)+'~r~n'
  103. THROW create runtimeerror
  104. end if
  105.  
  106. l_hmap= CreateFileMapping(l_hfile, l_Secu, PAGE_READONLY, 0, 0, ls_ref)
  107. if l_hmap<=0 then
  108. ls_errtext='CreateFileMapping:'+string(l_hmap)+'~r~n'
  109. THROW create runtimeerror
  110. end if
  111.  
  112. l_pAddr=MapViewOfFile(l_hmap, FILE_MAP_READ,0,0,l_size);
  113. if l_pAddr<=0 then
  114. ls_errtext='MapViewOfFile:'+string(l_pAddr)+'~r~n'
  115. THROW create runtimeerror
  116. end if
  117.  
  118. MD5Init(lpContext)
  119. MD5Update(lpContext,l_pAddr,l_size)
  120. MD5Final(lpContext)
  121.  
  122. catch(runtimeerror e)
  123. ls_errtext+=e.getmessage()
  124. finally
  125.  
  126. if l_pAddr>0 then
  127. UnmapViewOfFile(l_pAddr);
  128. l_pAddr=0
  129. end if
  130.  
  131. if l_hmap>0 then
  132. lb_ret=CloseHandle(l_hmap)
  133. if lb_ret=false then
  134. ls_errtext+='CloseHandle:'+string(lb_ret)+'~r~n'
  135. //goto e
  136. else
  137. l_hmap=0
  138. end if
  139. end if
  140.  
  141. if l_hfile>0 then
  142. lb_ret=CloseHandle(l_hfile)
  143. if lb_ret=false then
  144. ls_errtext+='CloseHandle:'+string(lb_ret)+'~r~n'
  145. //goto e
  146. else
  147. l_hfile=0
  148. end if
  149. end if
  150.  
  151. end try
  152.  
  153. if ls_errtext<>'' then goto e
  154.  
  155. lbyte_result[]=lpContext.b[]
  156. hexencode(lbyte_result[],lc_result[])
  157. ls_result=lc_result[]
  158.  
  159. return ''
  160.  
  161. goto e
  162. e:
  163. return ls_errtext
  164. end function
  165.  
  166. public function string uf_md5string (ref blob ls_string, ref string ls_result);ulong l_size
  167. md5_ctx lpContext
  168. char lc_result[]
  169. byte lbyte_result[]
  170. ls_result=''
  171. l_size=len(ls_string)
  172.  
  173. MD5Init(lpContext)
  174. MD5Update(lpContext,ls_string,l_size)
  175. MD5Final(lpContext)
  176.  
  177. lbyte_result[]=lpContext.b[]
  178. hexencode(lbyte_result[],lc_result[])
  179. ls_result=lc_result[]
  180.  
  181. return ''
  182. end function
  183.  
  184. public function string decto (decimal ad_dec, readonly unsignedinteger aui_sys);//作用:将十进制数字转成其他进制字符串
  185. //參数1:十进制数字
  186. //參数2:目标进制
  187. string ls_ret //返回的结果
  188. string ls_dec
  189. string ls_left,ls_right,ls_mod
  190. uint ld_mod /*余数为整数*/
  191. dec ld_mul //取小数的乘积为dec
  192. int i,li_pos,li_len,li_pointpos,li_maxpower,li_minpower
  193. if isnull(ad_dec) or isnull(aui_sys) or aui_sys<2 then goto e
  194.  
  195. ls_dec=string(ad_dec)
  196. li_pointpos=pos(ls_dec,'.')
  197.  
  198. if li_pointpos=0 then
  199.  
  200. if ad_dec<aui_sys then //大于10进制
  201. if ad_dec<=9 then
  202. ls_ret=string(ad_dec)
  203. goto e
  204. elseif ad_dec>9 and ad_dec<aui_sys then
  205. ls_ret=char(64 - 9 + ad_dec) //大于9的数字为转换为字母
  206. goto e
  207. end if
  208. else
  209. do
  210. ld_mod=mod(ad_dec,aui_sys) //取余数
  211. ls_mod=decto(ld_mod,aui_sys)
  212. ls_ret=ls_mod+ls_ret
  213.  
  214. ad_dec=long(( ad_dec - ld_mod) / aui_sys ) //去余取商
  215.  
  216. loop until ad_dec<aui_sys
  217.  
  218. if ad_dec>9 then
  219. ls_ret=char(64 - 9 + ad_dec)+ls_ret
  220. else
  221. ls_ret=string(ad_dec)+ls_ret
  222. end if
  223.  
  224. end if
  225. else
  226. ls_left=mid(ls_dec,1,li_pointpos) //取整数
  227. ls_right=mid(ls_dec,li_pointpos) //取小数
  228. ls_ret=decto(dec(ls_left),aui_sys)+'.' //整数部分转换
  229.  
  230. ld_mul=dec(ls_right)
  231. for i=1 to 10 //最大精度为10
  232. ld_mul=ld_mul * aui_sys
  233. ls_ret=ls_ret+string(int(ld_mul)) //取整
  234. if ld_mul=int(ld_mul) then exit //没有余数
  235. ld_mul=ld_mul - int(ld_mul) //去除整数
  236. next
  237.  
  238. end if
  239.  
  240. e:
  241. return ls_ret
  242.  
  243. end function
  244.  
  245. public function integer hexencode (ref byte lb_array[], ref character lc_result[]);//将字符转换成16进制编码
  246. //參数1:是要转换的字符
  247. //參数2:源字符中编码
  248. //返回16进制编码
  249. long l_len,i,l_num
  250. char lc_temp[2]
  251.  
  252. l_len=upperbound(lb_array[])
  253.  
  254. for i=1 to l_len
  255. l_num= (2 * i) - 1
  256. if lb_array[i]<16 then //小于16的要补0
  257. lc_temp[1]='0'
  258. lc_temp[2]=decto(lb_array[i],16)
  259. else
  260. lc_temp[]=decto(lb_array[i],16)
  261. end if
  262. lc_result[l_num]=lc_temp[1]
  263. lc_result[l_num + 1]=lc_temp[2]
  264. next
  265.  
  266. return l_len*2
  267.  
  268. //blob lb_text
  269. //blob{100} lb_stext
  270. //string ls_text2,ls_ret,ls_str1
  271. //int i,li_len,li_asc
  272. //string ls_hex
  273. ////ls_text2=space(100)
  274. //
  275. ////转换成编码encodingutf16BE
  276. //if len(as_text)<=50 then
  277. // lb_stext=blob(as_text,ae_encode)
  278. // ls_text2=string(lb_stext,encodingutf16Be!)
  279. //else
  280. // lb_text=blob(as_text,ae_encode)
  281. // ls_text2=string(lb_text,encodingutf16Be!)
  282. //end if
  283. //
  284. //li_len=len(ls_text2)
  285. //
  286. //for i=1 to li_len
  287. // ls_str1=mid(ls_text2,i,1)
  288. // li_asc=asc(ls_str1)
  289. // ls_hex=decto(li_asc,16)
  290. //
  291. // ////
  292. // if ae_encode=encodingutf16BE! then //高尾
  293. // ls_hex=fill('0',4 - len(ls_hex))+ls_hex
  294. // ls_ret=ls_ret+ls_hex
  295. // elseif ae_encode=encodingutf16lE! then //低尾
  296. // ls_hex=fill('0',4 - len(ls_hex))+ls_hex
  297. // ls_ret=ls_ret+ls_hex
  298. // else
  299. // if right(ls_hex,2)='00' then ls_hex=left(ls_hex,2)
  300. // ls_ret=ls_ret+ls_hex
  301. // end if
  302. //next
  303. //
  304. //return ls_ret
  305.  
  306. end function
  307.  
  308. public function string uf_md5string (ref string ls_string, ref string ls_result);
  309. blob lblob_string
  310. lblob_string=blob(ls_string,encodingutf8!)
  311. uf_md5string(lblob_string,ls_result)
  312. return ''
  313. end function
  314.  
  315. on u_derek_md5.create
  316. call super::create
  317. TriggerEvent( this, "constructor" )
  318. end on
  319.  
  320. on u_derek_md5.destroy
  321. TriggerEvent( this, "destructor" )
  322. call super::destroy
  323. end on

PB MD5的更多相关文章

  1. JAVA中MD5加密实现

    MD5加密实现  结 package com.pb; import java.io.UnsupportedEncodingException; import java.security.Message ...

  2. PB调用C#编写的DLL

    C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了 ...

  3. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  4. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  5. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  6. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  7. android_m2repository_rxx.zip下载地址以及MD5

    地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E646 ...

  8. 一种简单的md5加盐加密的方法(防止彩虹表撞库)

    md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加 ...

  9. 2、摘要函数——MD2/MD4/MD5数字签名

    摘要是用来防止数据被私自改动的方法,其中用到的函数叫做摘要函数.这些函数的输入可以是任意大小的信息,但是输出是大小固定的摘要.摘要有个重要的特性:如果改变了输入信息的任何内容,即使改变一位,输出也将发 ...

随机推荐

  1. C#筆記--DataGridView使用

    1.databingcomplete 当数据源的内容更改时,或者当 DataSource.DataMember 或 BindingContext 属性的值更改时,会引发此事件. 例如,如果要基于内容更 ...

  2. Eclipse使用入门指南及技巧

    Java是必须的   安装一个JDK就可以了,比如jdk-6u39-windows-x64.exe,安装完毕,会自行安装JRE. 如果不用IDE,这个时候用记事本也是可以写程序,然后用javac编译, ...

  3. .net+EF+mvc通过EasyUI的DataGrid实现增删改查

    @{    Layout = null;} <!DOCTYPE html> <html><head>    <meta name="viewport ...

  4. Python tldextract模块

    最新发布的 PyPI: pip install tldextract 或者最新的开发版本: pip install -e 'git://github.com/john-kurkowski/tldext ...

  5. python selenium定位总结(转)

    转自:http://www.cnblogs.com/yufeihlf/p/5717291.html 父子定位元素 查找有父亲元素的标签名为span,它的所有标签名叫input的子元素 find_ele ...

  6. 初识 Spring 框架

    初识 Spring 框架可以帮助我们构建规范的.优秀的应用程序,简化烦琐的编码过程. Spring 是一个非常著名的轻量级的企业级开源框架,Spring 的目标是使 Java EE 更易用并促进良好的 ...

  7. Python之FTP实现

    Python之FTP实现 上传下载: import socket import struct import json import subprocess import os class MYTCPSe ...

  8. form 表单onclick事件 禁止表单form提交

    最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然提交了. 于是仔细研究了下onclick.onsubmit.submit集合函数 ...

  9. jmap Unable to open socket file解决

    pid:Unable to open socket file: target process not responding or HotSport VM not loadedThe -F option ...

  10. Qt——信号与槽用法总结(未完待续)

    1.设计模式中信号与槽编辑选项卡 2.右键组件,转到槽,写函数 void LoginDialog::on_loginBtn_clicked() { accept(); } 3.信号与槽编辑模式 按下F ...