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

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

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

这里能够去下载附件

//调用例子:
u_derek_md5 lu_md5
lu_md5=create u_derek_md5
string ls_text="123"
string ls_result,ls_ret
string ls_filepath="C:\1.txt" //对字符串进行md5
lu_md5.uf_md5string(ls_text,ref ls_result)
messagebox('',ls_result) //对文件进行md5,大附件的处理速度也比第三方组件快
ls_ret=lu_md5.uf_md5file(ls_filepath,ref ls_result)
if ls_ret<>'' then //返回非空为失败
messagebox('',ls_ret)
else
messagebox('',ls_result)
end if destroy lu_md5
forward
global type u_derek_md5 from nonvisualobject
end type
type md5_ctx from structure within u_derek_md5
end type
end forward type md5_ctx from structure
byte a[8]
byte b[16]
byte c[64]
byte d[16]
end type shared variables end variables
global type u_derek_md5 from nonvisualobject
end type
global u_derek_md5 u_derek_md5 type prototypes FUNCTION long OpenProcess(long dwDesiredAccess,long bInheritHandle,long dwProcessId) LIBRARY "kernel32.dll" ALIAS FOR "OpenProcess;ansi"
Function boolean CloseHandle (long hObject ) Library "kernel32" Alias for "CloseHandle;ansi" 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"
Function ulong CreateFileMapping (ulong hFile ,ulong lpFileMappigAttributes[3], ulong flProtect , ulong dwMaximumSizeHigh , ulong dwMaximumSizeLow ,ref String lpName ) Library "kernel32" Alias for "CreateFileMappingA;ansi"
Function ulong OpenFileMapping(ulong dwDesiredAccess , boolean bInheritHandle ,ref string lpName) Library "kernel32" Alias for "OpenFileMappingA;ansi"
Function ulong MapViewOfFile (ulong hFileMappingObject , ulong dwDesiredAccess , ulong dwFileOffsetHigh , ulong dwFileOffsetLow , ulong dwNumberOfBytesToMap ) Library "kernel32"Alias for "MapViewOfFile"
SUBROUTINE UnmapViewOfFile (ulong lpBaseAddress ) Library "kernel32" alias for "UnmapViewOfFile;ansi" SUBROUTINE MD5Init (ref md5_ctx lpContext ) Library "cryptdll.dll" alias for "MD5Init;ansi"
SUBROUTINE MD5Final (ref md5_ctx lpContext ) Library "cryptdll.dll" alias for "MD5Final;ansi"
SUBROUTINE MD5Update (ref md5_ctx lpContext ,ulong lpBuffer,ulong BufSize ) Library "cryptdll.dll" alias for "MD5Update;ansi"
SUBROUTINE MD5Update (ref md5_ctx lpContext,blob lpBuffer,ulong BufSize ) Library "cryptdll.dll" alias for "MD5Update;ansi" end prototypes type variables CONSTANT ulong GENERIC_READ=2147483648
CONSTANT ulong FILE_SHARE_READ=1
CONSTANT ulong OPEN_EXISTING=3
CONSTANT ulong FILE_ATTRIBUTE_NORMAL=128
CONSTANT ulong PAGE_READONLY=2
CONSTANT ulong FILE_MAP_READ=4 end variables forward prototypes
public function string uf_md5file (ref string ls_filename, ref string ls_result)
public function string uf_md5string (ref blob ls_string, ref string ls_result)
public function string decto (decimal ad_dec, readonly unsignedinteger aui_sys)
public function integer hexencode (ref byte lb_array[], ref character lc_result[])
public function string uf_md5string (ref string ls_string, ref string ls_result)
end prototypes public function string uf_md5file (ref string ls_filename, ref string ls_result);ulong l_size
ulong l_hfile,l_hmap,l_pAddr
long l_ret
ulong l_Secu[3]
md5_ctx lpContext
char lc_result[]
byte lbyte_result[]
string ls_ref,ls_errtext
boolean lb_ret ls_result=''
ls_filename=string(ls_filename,'') if DirectoryExists ( ls_filename )=true then
ls_errtext='不能是目录!' //+string(ls_filename)+'~r~n'
goto e
end if if fileexists(ls_filename)=false then
ls_errtext='文件不存在!' //+string(ls_filename)+'~r~n'
goto e
end if l_size=FileLength ( ls_filename )
if l_size=-1 then
ls_errtext='FileLength:'+string(l_size)+'~r~n'
goto e
end if if l_size=0 then
ls_errtext='文件内容不能为空:'+string(l_size)+'~r~n'
goto e
end if if l_size>2*645*1024*1024 then //最大支持
ls_errtext='最大支持:'+string(2*645*1024*1024,'###,###,##0')+'~r~n'
goto e
end if try l_hfile=CreateFile(ls_filename,GENERIC_READ,FILE_SHARE_READ,l_Secu[],OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
if l_hfile<=0 then
ls_errtext='CreateFile:'+string(l_hfile)+'~r~n'
THROW create runtimeerror
end if l_hmap= CreateFileMapping(l_hfile, l_Secu, PAGE_READONLY, 0, 0, ls_ref)
if l_hmap<=0 then
ls_errtext='CreateFileMapping:'+string(l_hmap)+'~r~n'
THROW create runtimeerror
end if l_pAddr=MapViewOfFile(l_hmap, FILE_MAP_READ,0,0,l_size);
if l_pAddr<=0 then
ls_errtext='MapViewOfFile:'+string(l_pAddr)+'~r~n'
THROW create runtimeerror
end if MD5Init(lpContext)
MD5Update(lpContext,l_pAddr,l_size)
MD5Final(lpContext) catch(runtimeerror e)
ls_errtext+=e.getmessage()
finally if l_pAddr>0 then
UnmapViewOfFile(l_pAddr);
l_pAddr=0
end if if l_hmap>0 then
lb_ret=CloseHandle(l_hmap)
if lb_ret=false then
ls_errtext+='CloseHandle:'+string(lb_ret)+'~r~n'
//goto e
else
l_hmap=0
end if
end if if l_hfile>0 then
lb_ret=CloseHandle(l_hfile)
if lb_ret=false then
ls_errtext+='CloseHandle:'+string(lb_ret)+'~r~n'
//goto e
else
l_hfile=0
end if
end if end try if ls_errtext<>'' then goto e lbyte_result[]=lpContext.b[]
hexencode(lbyte_result[],lc_result[])
ls_result=lc_result[] return '' goto e
e:
return ls_errtext
end function public function string uf_md5string (ref blob ls_string, ref string ls_result);ulong l_size
md5_ctx lpContext
char lc_result[]
byte lbyte_result[]
ls_result=''
l_size=len(ls_string) MD5Init(lpContext)
MD5Update(lpContext,ls_string,l_size)
MD5Final(lpContext) lbyte_result[]=lpContext.b[]
hexencode(lbyte_result[],lc_result[])
ls_result=lc_result[] return ''
end function public function string decto (decimal ad_dec, readonly unsignedinteger aui_sys);//作用:将十进制数字转成其他进制字符串
//參数1:十进制数字
//參数2:目标进制
string ls_ret //返回的结果
string ls_dec
string ls_left,ls_right,ls_mod
uint ld_mod /*余数为整数*/
dec ld_mul //取小数的乘积为dec
int i,li_pos,li_len,li_pointpos,li_maxpower,li_minpower
if isnull(ad_dec) or isnull(aui_sys) or aui_sys<2 then goto e ls_dec=string(ad_dec)
li_pointpos=pos(ls_dec,'.') if li_pointpos=0 then if ad_dec<aui_sys then //大于10进制
if ad_dec<=9 then
ls_ret=string(ad_dec)
goto e
elseif ad_dec>9 and ad_dec<aui_sys then
ls_ret=char(64 - 9 + ad_dec) //大于9的数字为转换为字母
goto e
end if
else
do
ld_mod=mod(ad_dec,aui_sys) //取余数
ls_mod=decto(ld_mod,aui_sys)
ls_ret=ls_mod+ls_ret ad_dec=long(( ad_dec - ld_mod) / aui_sys ) //去余取商 loop until ad_dec<aui_sys if ad_dec>9 then
ls_ret=char(64 - 9 + ad_dec)+ls_ret
else
ls_ret=string(ad_dec)+ls_ret
end if end if
else
ls_left=mid(ls_dec,1,li_pointpos) //取整数
ls_right=mid(ls_dec,li_pointpos) //取小数
ls_ret=decto(dec(ls_left),aui_sys)+'.' //整数部分转换 ld_mul=dec(ls_right)
for i=1 to 10 //最大精度为10
ld_mul=ld_mul * aui_sys
ls_ret=ls_ret+string(int(ld_mul)) //取整
if ld_mul=int(ld_mul) then exit //没有余数
ld_mul=ld_mul - int(ld_mul) //去除整数
next end if e:
return ls_ret end function public function integer hexencode (ref byte lb_array[], ref character lc_result[]);//将字符转换成16进制编码
//參数1:是要转换的字符
//參数2:源字符中编码
//返回16进制编码
long l_len,i,l_num
char lc_temp[2] l_len=upperbound(lb_array[]) for i=1 to l_len
l_num= (2 * i) - 1
if lb_array[i]<16 then //小于16的要补0
lc_temp[1]='0'
lc_temp[2]=decto(lb_array[i],16)
else
lc_temp[]=decto(lb_array[i],16)
end if
lc_result[l_num]=lc_temp[1]
lc_result[l_num + 1]=lc_temp[2]
next return l_len*2 //blob lb_text
//blob{100} lb_stext
//string ls_text2,ls_ret,ls_str1
//int i,li_len,li_asc
//string ls_hex
////ls_text2=space(100)
//
////转换成编码encodingutf16BE
//if len(as_text)<=50 then
// lb_stext=blob(as_text,ae_encode)
// ls_text2=string(lb_stext,encodingutf16Be!)
//else
// lb_text=blob(as_text,ae_encode)
// ls_text2=string(lb_text,encodingutf16Be!)
//end if
//
//li_len=len(ls_text2)
//
//for i=1 to li_len
// ls_str1=mid(ls_text2,i,1)
// li_asc=asc(ls_str1)
// ls_hex=decto(li_asc,16)
//
// ////
// if ae_encode=encodingutf16BE! then //高尾
// ls_hex=fill('0',4 - len(ls_hex))+ls_hex
// ls_ret=ls_ret+ls_hex
// elseif ae_encode=encodingutf16lE! then //低尾
// ls_hex=fill('0',4 - len(ls_hex))+ls_hex
// ls_ret=ls_ret+ls_hex
// else
// if right(ls_hex,2)='00' then ls_hex=left(ls_hex,2)
// ls_ret=ls_ret+ls_hex
// end if
//next
//
//return ls_ret end function public function string uf_md5string (ref string ls_string, ref string ls_result);
blob lblob_string
lblob_string=blob(ls_string,encodingutf8!)
uf_md5string(lblob_string,ls_result)
return ''
end function on u_derek_md5.create
call super::create
TriggerEvent( this, "constructor" )
end on on u_derek_md5.destroy
TriggerEvent( this, "destructor" )
call super::destroy
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. Oracle反向字符截取逗號分隔字符串

    DECLARE M ); BEGIN FOR I IN ( WITH T AS (SELECT REVERSE('i,am,a,test,hahahhah') AS STR FROM DUAL) SE ...

  2. js里的稀疏数组

    今天在逛掘金网站的时候,在一篇文章里学到一个新名字,稀疏数组,特此记录一下. 稀疏数组就是包含从0开始的不连续索引的数组.也就是说数组中大部分的内容值都未被使用(或都为零). var arr = ne ...

  3. 0.ssm web项目中的遇到的坑

    1.自定义的菜单,href为项目的相对路径,即: : 点击一个菜单,后再点击另一个菜单,然后发现浏览器地址栏的链接是在上一个链接后面拼接的,也就报错了. 解决办法: 每一个菜单的href前增加&quo ...

  4. 使用soapUI5.3.0调试webservice接口(参数为XML格式)

    最近项目中经常要调试webservice接口,从朋友处了解到他们经常使用SoapUI,因此学习一下这个工具的使用,为避免遗忘,特地记录下来,分享分享... 下载 #####首先,下载SoapUI,我下 ...

  5. 根据截至日期格式获取倒计时&&时间戳转日期格式

    //时间戳转日期格式,传入时间戳必须为数字类型function currentDate(shijianchuo) { var date = new Date(shijianchuo); var y = ...

  6. linux 服务脚本

    #!/bin/bash # # chkconfig: # description: my_SERVICE_NAME is a my Service # # common function . /etc ...

  7. 在项目中全局添加FastClick导致图片上传插件在ios端失效的解决方案

    ---恢复内容开始--- 项目是移动端的项目,为了解决300ms的click延迟,所以在全局中加入了FastClick,引入的方式很简单,网上一大堆教程,这里不做赘述 我们就谈,我遇到的问题: 某天产 ...

  8. 【分治】输出前k大的数

    描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每个整 ...

  9. 每天学点Python之collections

    每天学点Python之collections 内容摘抄自:<python大法好>的每天学点Python之collections collections模块在内置数据类型(dict.list ...

  10. 最近编译POCO 库和 Boost库的笔记

    最近在编译POCO库和BOOST库 先讲一下编译POCO库,我编译的是1.9.0,过程相当曲折,要OPENSSL修改版本的,个OPENSSL在这里下载,如果你用一般未修改的OPENSSL 是编译不了, ...