我不是MM,但是我有问题,关于BASE64加密/解密中文字符的~

mendel 2003-09-13 10:20:18
以下是在ASP中测试通过的代码,但是在VB中却出现问题,

出错提未为:
=============
实时错误“5”
无效的过程调用或参数。


出错代码:
=============
If M3 > 0 Then
asContents = asContents & String(3 - M3, ChrB(0))
End If
'补足位数是为了便于计算



rainstormmaster(rainstormmaster)的回答:
==========================================
"中国"不是ANSI编码的字符串,要用strconv转一下,类似这样:
s = StrConv(s, vbFromUnicode)



我在取得字符串之后,先用strconv(str,vbfromunicode)进行转换,然后再用
base64encode(str)加密,但是就出错了。


...全文
56 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
mendel 2003-09-17
  • 打赏
  • 举报
回复
问题是我用VB就加密不了啊~~~
rainstormmaster 2003-09-16
  • 打赏
  • 举报
回复
但是rainstormmaster(rainstormmaster)神龙见首不见尾,偶的问题没有解决,又找不到他~

不好意思,才看到,可以给我发短消息呀:)

你的代码太乱,正在重写代码,现在先把编码部分贴出来:
Option Explicit
Dim charlist As String
Private Function Base64encode(ByVal s As String) As String
Dim ByteArray() As Byte
ByteArray = StrConv(s, vbFromUnicode) '将字串转为byte数组
Dim tempstr As String
Dim stemp As String
Dim i As Long
Dim j As Long, k As Long
Dim num1 As Long, num2 As Long, num3 As Long, num4 As Long
i = UBound(ByteArray)
i = (i + 1) Mod 3
Select Case i
Case 0
If s = vbNullString Then
Base64encode = ""
Exit Function
End If
For j = 0 To UBound(ByteArray) Step 3
num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
num4 = ByteArray(j + 2) And 63
stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
tempstr = tempstr + stemp
Next
Case 1
For j = 0 To UBound(ByteArray) - 1 Step 3
num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
num4 = ByteArray(j + 2) And 63
stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
tempstr = tempstr + stemp
Next
'处理数组的最后1个元素
k = UBound(ByteArray)
num1 = ByteArray(k) \ 2 ^ 2
num2 = (ByteArray(k) And 3) * 2 ^ 4
stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & "=="
tempstr = tempstr + stemp
Case 2
For j = 0 To UBound(ByteArray) - 2 Step 3
num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
num4 = ByteArray(j + 2) And 63
stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
tempstr = tempstr + stemp
Next
'处理数组的最后2个元素
k = UBound(ByteArray)
num1 = ByteArray(k - 1) \ 2 ^ 2 '右移2位,即取前6位
num2 = (ByteArray(k - 1) And 3) * 2 ^ 4 + ByteArray(k) \ 2 ^ 4
num3 = (ByteArray(k) And 15) * 2 ^ 2
stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & "="
tempstr = tempstr + stemp
End Select

Base64encode = tempstr
End Function

Private Sub Form_Load()
charlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
End Sub
flxa 2003-09-16
  • 打赏
  • 举报
回复
BASE64是一种加密吗??

如果用他加密的话,那他的解密是可破解的!最好不要用这种加密方法!
EastBuBai 2003-09-16
  • 打赏
  • 举报
回复
你可以一句一句的跟踪的来看一下
rainstormmaster 2003-09-16
  • 打赏
  • 举报
回复
用来加密文本文件还是可以的
mendel 2003-09-14
  • 打赏
  • 举报
回复
加了,还是没用。
Dublue 2003-09-14
  • 打赏
  • 举报
回复
是不是转换字符串后多出了空格?再加一层trim试试
mendel 2003-09-14
  • 打赏
  • 举报
回复
TO HONGSONGBOY(红松),这是STRING的用法:
String 函数


返回 Variant (String),其中包含指定长度重复字符的字符串。

语法

String(number, character)

String 函数的语法有下面的命名参数:

部分 说明
number 必要参数;Long。返回的字符串长度。如果 number 包含 Null,将返回 Null。
character 必要参数;Variant。为指定字符的字符码或字符串表达式,其第一个字符将用于建立返回的字符串。如果 character 包含 Null,就会返回 Null。


说明

如果指定 character 的数值大于 255,String 会按下面的公式将其转为有效的字符码:

character Mod 256







TO AIJIE099(茅庐小生):你的方法不管用,试过了。
aijie099 2003-09-14
  • 打赏
  • 举报
回复
应该没什么问题的呀.m3,是不是要声明一下,还有那些变量,都声明一下吧.试试.
还 有那个:m3=xxx mod 3 ,改成:m3=(xxxx mod 3) 或者:m3=int(len(xxx)-xxx/3)多试试.
hongsongboy 2003-09-14
  • 打赏
  • 举报
回复
请问楼主 String(3 - M3, ChrB(0)) 是何意思???
mendel 2003-09-14
  • 打赏
  • 举报
回复
是啊。我用搜索整一VB版,也没有找到,哪位高手给解决一下啊,谢谢
sworddx 2003-09-14
  • 打赏
  • 举报
回复
精华区没找到。
viena 2003-09-13
  • 打赏
  • 举报
回复
头晕,gz
lisen101 2003-09-13
  • 打赏
  • 举报
回复
头晕,gz
mendel 2003-09-13
  • 打赏
  • 举报
回复
这是我原来的贴子,但是rainstormmaster(rainstormmaster)神龙见首不见尾,偶的问题没有解决,又找不到他~只好开个新贴,请版主见谅~

http://expert.csdn.net/Expert/topic/2250/2250144.xml?temp=.5085413
mendel 2003-09-13
  • 打赏
  • 举报
回复
这是我在VB中的源代码,请帮我看看哪里有错?

Public sBASE_64_CHARACTERS


Function Base64encode(asContents) As String
'将Ansi编码的字符串进行Base64编码
'asContents应当是ANSI编码的字符串(二进制的字符串也可以)
Dim lnPosition
Dim lsResult
Dim Char1
Dim Char2
Dim Char3
Dim Char4
Dim Byte1
Dim Byte2
Dim Byte3
Dim SaveBits1
Dim SaveBits2
Dim lsGroupBinary
Dim lsGroup64
Dim M4, len1, len2

len1 = LenB(asContents)
If len1 < 1 Then
Base64encode = ""
Exit Function
End If

M3 = len1 Mod 3

'MsgBox asContents
'Exit Function
If M3 > 0 Then
asContents = asContents & String(3 - M3, ChrB(0))
End If
'补足位数是为了便于计算

If M3 > 0 Then
len1 = len1 + (3 - M3)
len2 = len1 - 3
Else
len2 = len1
End If

lsResult = ""

For lnPosition = 1 To len2 Step 3
lsGroup64 = ""
lsGroupBinary = MidB(asContents, lnPosition, 3)

Byte1 = AscB(MidB(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))

Char1 = MidB(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1)
Char2 = MidB(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
Char4 = MidB(sBASE_64_CHARACTERS, (Byte3 And 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4

lsResult = lsResult & lsGroup64
Next

'处理最后剩余的几个字符
If M3 > 0 Then
lsGroup64 = ""
lsGroupBinary = MidB(asContents, len2 + 1, 3)

Byte1 = AscB(MidB(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = AscB(MidB(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = AscB(MidB(lsGroupBinary, 3, 1))

Char1 = MidB(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1)
Char2 = MidB(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = MidB(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)

If M3 = 1 Then
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) '用=号补足位数
Else
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61) '用=号补足位数
End If

lsResult = lsResult & lsGroup64
End If

Base64encode = lsResult

End Function


Function Base64decode(asContents)
'将Base64编码字符串转换成Ansi编码的字符串
'asContents应当也是ANSI编码的字符串(二进制的字符串也可以)
Dim lsResult
Dim lnPosition
Dim lsGroup64, lsGroupBinary
Dim Char1, Char2, Char3, Char4
Dim Byte1, Byte2, Byte3
Dim M4, len1, len2

len1 = LenB(asContents)
M4 = len1 Mod 4

If len1 < 1 Or M4 > 0 Then
'字符串长度应当是4的倍数
Base64decode = ""
Exit Function
End If

'判断最后一位是不是 = 号
'判断倒数第二位是不是 = 号
'这里m4表示最后剩余的需要单独处理的字符个数
If MidB(asContents, len1, 1) = ChrB(61) Then M4 = 3
If MidB(asContents, len1 - 1, 1) = ChrB(61) Then M4 = 2

If M4 = 0 Then
len2 = len1
Else
len2 = len1 - 4
End If

For lnPosition = 1 To len2 Step 4
lsGroupBinary = ""
lsGroup64 = MidB(asContents, lnPosition, 4)
Char1 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 1, 1)) - 1
Char2 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 2, 1)) - 1
Char3 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 3, 1)) - 1
Char4 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 4, 1)) - 1
Byte1 = ChrB(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
lsGroupBinary = Byte1 & Byte2 & Byte3

lsResult = lsResult & lsGroupBinary
Next

'处理最后剩余的几个字符
If M4 > 0 Then
lsGroupBinary = ""
lsGroup64 = MidB(asContents, len2 + 1, M4) & ChrB(65) 'chr(65)=A,转换成值为0
If M4 = 2 Then '补足4位,是为了便于计算
lsGroup64 = lsGroup64 & ChrB(65)
End If
Char1 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 1, 1)) - 1
Char2 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 2, 1)) - 1
Char3 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 3, 1)) - 1
Char4 = InStrB(sBASE_64_CHARACTERS, MidB(lsGroup64, 4, 1)) - 1
Byte1 = ChrB(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & ChrB(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))

If M4 = 2 Then
lsGroupBinary = Byte1
ElseIf M4 = 3 Then
lsGroupBinary = Byte1 & Byte2
End If

lsResult = lsResult & lsGroupBinary
End If

Base64decode = lsResult

End Function

Private Sub Command1_Click()
Dim aaa, bbb
aaa = Base64encode(Text1.Text)
'bbb = Base64decode(aaa)
Text2.Text = aaa
End Sub

Private Sub Command2_Click()
Dim aa, bb
aa = Base64decode(Text2.Text)
Text3.Text = aa
End Sub

Private Sub Form_Load()
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERS = StrConv(sBASE_64_CHARACTERS, vbFromUnicode)
End Sub

mendel 2003-09-13
  • 打赏
  • 举报
回复
而且,我要加密的是中英文和数字的混合字符串
mendel 2003-09-13
  • 打赏
  • 举报
回复
to yunfeng007(一水寒) :没有用,还是错的。

to chenkangli(编程浪子) :可以给我个地址吗?谢谢
chenkangli 2003-09-13
  • 打赏
  • 举报
回复
这个问题在网络版的精华区有。
yunfeng007 2003-09-13
  • 打赏
  • 举报
回复
If M3 > 0 Then
asContents = asContents & String(3 - M3, Chr(0))
End If
试试?
加载更多回复(2)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧