UUENCODE(UUE) 编码简介

VB.基础技术 同时被 3 个专栏收录
13 篇文章 1 订阅
21 篇文章 1 订阅
23 篇文章 0 订阅

UUENCODE(UUE) 编码简介

注:UUENCODE下简称“UUE”,基本介绍见百度:http://baike.baidu.com/link?url=qPMUBz9X4N2C-SGRSaVgW3YQJgKF0WDB6NhSAZ6YgEYVkxsOpH99MLuyCiojqM77mcNL8klCuB8BK96CXHmqGSHe2Gjc9X6XqYLOJSOSK8W

这几天在弄asp包装为Dll,嫌每次更改代码都要编译DLL并重装太麻烦,遂想学AspToDll风火轮或ASPtoDLL那样,一劳永逸的安装个dll然后提交编码代码执行即可。 
但现在的几个ASP代码加密工具都有解码器了,有违我将ASP打包为DLL的初衷,遂翻出来以前的几个可逆编码器,想改掉密码本base64的已经有现成的讲解文章了(http://blog.csdn.net/xuefeng0707/article/details/19845111),就不写了,可是UUE的说明没找到,于是自己用以前下载自(http://blog.csdn.net/tzwsohohttp://download.csdn.net/source/564897,注:均有BUG)的代码研究了一下,才发现编码表原来整的这么简单。

(以下为摘抄的部分算法=====================)

Uuencode的算法很简单,编码时它将3个字符顺序放入一个24位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为4个部分,高位在先,每个部分6位,用下面的64个字符重新表示:

“`!”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_”

在文件的开头有“begin xxx 
被编码的文件名”,在文件的结尾有“end”,用来标志Uue文件的开始和结束。编码时,每次读取源文件的45个字符,不足45个的用“NULL”补足为3的整数倍(如:23补为24),然后输入目标文件一个ASCII为:“32+实际读取的字符数”的字符作为每一行的开始。读取的字符编码后输入目标文件,再输入一个“换行符”。如果源文件被编码完了,那么输入“`(ASCII为96)”和一个“换行符”表示编码结束。

解码时它将4个字符分别转换为4个6位字符后,截取有用的后六位放入一个 24 位的缓冲区,即得3个二进制代码。

‘===================================================================

按照以上介绍和研究结果,我自己写了一份自己好理解的算法说明:

编码表 :用 ASCII 33 to 96 

&b000001 1=33 chr(33)= ! 

to 

&b111111 63=95 chr(95)= _ 

&b000000 0=96 chr(96)= ` 


将字符拆分为三个一组,组成3*8位=24位,后每6位裁为一个字符,裁为 24位/6位=4字符, 
裁得的每6位为编码表顺序号,去码表查询转换为对应顺序号的ASCII码 asc(裁得6位二进制数字+32)=对应字符,特例:0=96。

编码为文件时,首行和末行加标识,表示文件名

开始 数字 文件名 (中间的数字777不知何意,只可为数字) begin 777 uuecode.bin 
文件末尾加 end 结束

例:

begin 888 uuecode.binM`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[

#\]^_ 

end 

注:以上代码复制到记事本保存为扩展名为 uue 的文件,可用winrar解压得到源文件uuecode.bin

编码每一行对应45个字节,行首用大写字母 M 开头,(表示后跟几个编码前原始字节,实际包含编码字节为(45/3)*4=60个编码后字符 
,asc(M)=77=45+32 ,32为字符表起始值减1),后跟编码完成的内容。 
末行如为不足45字节,超出部分字节数量加32转换为行首字符,同上,asc(剩余字节数+32)做行首字符,到“END”标识结束。

取三个字符时,如不足三个,用 0 填充剩余位数,补足24位,编码后如base64那样的 = 号放末尾,这里则用 ,chr(96)字符 
做末尾标识字符,因为
 字符本身在编码表代表 0 
,有冲突,所以,必须在行首字符记录后面的编码串所带的原始字符数(注:这里如要自定义编码规则为纯字符串编码时,可以使用编码表外的字符如chr(97)至chr(127)来做末尾不齐字符。仅供参考!)

同时,今天重新处理了一下base64编码表,将其直接用一串字符串代替来查询,如:const BASE_64_MAP_INIT = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/” 
对比UUE和base64编码,发现,除了文件输出格式略有区别外,两种编码的算法是完全一致的。因此,将前面 BASE_64_MAP_INIT 的值换为UUE的码表,`!”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_,同时将末尾补齐用的 = 字符换为其他在码表中不存在的字符后,即可使用base64编码解码程序来处理UUE编码文本!

同理自定义你自己的编码表即可得到属于你自己的独一无二的加密解密代码!如适当配合字符可逆易位编码,效果更佳!

(以下代码已调试对比UUE标准编码器通过,注:因只用于纯字符串编码解码,所以,不处理定长折行和加入行首字母)代码摘自:(http://wang11291895.blog.163.com/blog/static/37879790200869334471/) ,并解决了大幅度的Bug,优化。

Option Explicit

'Private Const BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
Private Const BASE_64_MAP_INIT = "`!" & """" & "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_~"
Private Base64EncMap(64) As String
Private Base64DecMap(127) As Byte

Private Sub cmd_base64De_Click()
    Text1.Text = NewBase64De(Text2.Text)
End Sub

Private Sub cmd_base64En_Click()
    Text2.Text = NewBase64En(Text1.Text)
End Sub

Public Function NewBase64En(ByVal plain As String) As String
    If Len(plain) = 0 Then
        NewBase64En = ""
        Exit Function
    End If
    Call initCodecs
    Dim ret As String, ndx As Integer, by3 As Integer
    Dim first As Byte, second As Byte, third As Byte, i
    Dim mAllByteIn() As Byte, inLangth As Integer
    mAllByteIn() = StrConv(plain, vbFromUnicode)
    inLangth = UBound(mAllByteIn) + 1 'Len(plain)
    by3 = (inLangth \ 3) * 3
    ndx = 1
    Do While ndx <= by3
        first = mAllByteIn(ndx - 1) 
        second = mAllByteIn(ndx + 0) 
        third = mAllByteIn(ndx + 1) 
        ret = ret & Base64EncMap((first \ 4) And 63)
        ret = ret & Base64EncMap(((first * 16) And 48) + ((second \ 16) And 15))
        ret = ret & Base64EncMap(((second * 4) And 60) + ((third \ 64) And 3))
        ret = ret & Base64EncMap(third And 63)
        ndx = ndx + 3
    Loop
    If by3 < inLangth Then
        first = mAllByteIn(ndx - 1) 
        ret = ret & Base64EncMap((first \ 4) And 63)
        If (inLangth Mod 3) = 2 Then
            second = mAllByteIn(ndx + 0) 
            ret = ret & Base64EncMap(((first * 16) And 48) + ((second \ 16) And 15))
            ret = ret & Base64EncMap(((second * 4) And 60)) & Base64EncMap(64) '"="
        Else
            ret = ret & Base64EncMap((first * 16) And 48)
            ret = ret & Base64EncMap(64) & Base64EncMap(64) ' "=="
        End If
    End If
    NewBase64En = ret
End Function

Public Function NewBase64De(ByVal scrambled As String) As String
    If Len(scrambled) = 0 Then
        NewBase64De = ""
    Exit Function
    End If
    Dim realLen As Integer
    Call initCodecs
    realLen = Len(scrambled)
    Do While Mid(scrambled, realLen, 1) = Base64EncMap(64)
        realLen = realLen - 1
    Loop
    Dim ret() As Byte, ndx As Integer, by4 As Integer, first As Byte, second As Byte, third As Byte, fourth As Byte
    Dim retLength As Integer
    by4 = (realLen \ 4) * 4
    ndx = 1
    ReDim ret(0)
    Do While ndx <= by4
        first = Base64DecMap(Asc(Mid(scrambled, ndx + 0, 1)))
        second = Base64DecMap(Asc(Mid(scrambled, ndx + 1, 1)))
        third = Base64DecMap(Asc(Mid(scrambled, ndx + 2, 1)))
        fourth = Base64DecMap(Asc(Mid(scrambled, ndx + 3, 1)))
        retLength = IIf(UBound(ret) = 0, UBound(ret) - 1, UBound(ret))
        ReDim Preserve ret(retLength + 3)
        ret(retLength + 1) = ((first * 4) And 255) + ((second \ 16) And 3)
        ret(retLength + 2) = ((second * 16) And 255) + ((third \ 4) And 15)
        ret(retLength + 3) = ((third * 64) And 255) + (fourth And 63)
        ndx = ndx + 4
    Loop
    If ndx < realLen Then
        first = Base64DecMap(Asc(Mid(scrambled, ndx + 0, 1)))
        second = Base64DecMap(Asc(Mid(scrambled, ndx + 1, 1)))
        retLength = IIf(UBound(ret) = 0, UBound(ret) - 1, UBound(ret))
        ReDim Preserve ret(retLength + 1)
        ret(retLength + 1) = ((first * 4) And 255) + ((second \ 16) And 3)
        If realLen Mod 4 = 3 Then
            third = Base64DecMap(Asc(Mid(scrambled, ndx + 2, 1)))
            retLength = UBound(ret) 
            ReDim Preserve ret(retLength + 1)
            ret(retLength + 1) = ((second * 16) And 255) + ((third \ 4) And 15)
        End If
    End If
    NewBase64De = StrConv(ret, vbUnicode)
End Function

Private Sub initCodecs() '初始化函数initCodecs
    Dim max As Integer, idx As Integer
    max = Len(BASE_64_MAP_INIT)
    For idx = 0 To max - 1
        Base64EncMap(idx) = Mid(BASE_64_MAP_INIT, idx + 1, 1)
    Next
    For idx = 0 To max - 1
        Base64DecMap(Asc(Base64EncMap(idx))) = idx
    Next
End Sub


源代码下载:(http://download.csdn.net/detail/jessezappy/9707790),UUE(UUENCODE ) & Base64编码解码原理源代码。可自定义编码表(纯字符串),修改编码表即可在UUE和Base64编码解码之间切换,已优化解决不支持中文的BUG。 

纯字符串方式,不考虑定长折行和加行首字符及文件头尾定义等,方便网页运用,可直接移植为ASP代码(需要删除AS变量类型限定)!

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

jessezappy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值