gpt4 book ai didi

vb.net - VB.NET 中的 Encode64/Decode64

转载 作者:行者123 更新时间:2023-12-02 05:27:22 25 4
gpt4 key购买 nike

很抱歉发表了这么长的帖子,但是是否已经实现了与 .NET 中的 VB6 代码简单等效的代码?非常感谢。

Public Function Encode64(sString As String) As String

Dim bTrans(63) As Byte, lPowers8(255) As Long, lPowers16(255) As Long, bout() As Byte, bIn() As Byte
Dim lChar As Long, lTrip As Long, iPad As Integer, lLen As Long, lTemp As Long, lPos As Long, lOutSize As Long

For lTemp = 0 To 63 'Fill the translation table.
Select Case lTemp
Case 0 To 25
bTrans(lTemp) = 65 + lTemp 'A - Z
Case 26 To 51
bTrans(lTemp) = 71 + lTemp 'a - z
Case 52 To 61
bTrans(lTemp) = lTemp - 4 '1 - 0
Case 62
bTrans(lTemp) = 43 'Chr(43) = "+"
Case 63
bTrans(lTemp) = 47 'Chr(47) = "/"
End Select
Next lTemp

For lTemp = 0 To 255 'Fill the 2^8 and 2^16 lookup tables.
lPowers8(lTemp) = lTemp * cl2Exp8
lPowers16(lTemp) = lTemp * cl2Exp16
Next lTemp

iPad = StrLen(sString) Mod 3 'See if the length is divisible by 3
If iPad Then 'If not, figure out the end pad and resize the input.
iPad = 3 - iPad
sString = sString & String(iPad, Chr(0))
End If

bIn = StrConv(sString, vbFromUnicode) 'Load the input string.
lLen = ((UBound(bIn) + 1) \ 3) * 4 'Length of resulting string.
lTemp = lLen \ 72 'Added space for vbCrLfs.
lOutSize = ((lTemp * 2) + lLen) - 1 'Calculate the size of the output buffer.
ReDim bout(lOutSize) 'Make the output buffer.

lLen = 0 'Reusing this one, so reset it.

For lChar = LBound(bIn) To UBound(bIn) Step 3
lTrip = lPowers16(bIn(lChar)) + lPowers8(bIn(lChar + 1)) + bIn(lChar + 2) 'Combine the 3 bytes
lTemp = lTrip And clOneMask 'Mask for the first 6 bits
bout(lPos) = bTrans(lTemp \ cl2Exp18) 'Shift it down to the low 6 bits and get the value
lTemp = lTrip And clTwoMask 'Mask for the second set.
bout(lPos + 1) = bTrans(lTemp \ cl2Exp12) 'Shift it down and translate.
lTemp = lTrip And clThreeMask 'Mask for the third set.
bout(lPos + 2) = bTrans(lTemp \ cl2Exp6) 'Shift it down and translate.
bout(lPos + 3) = bTrans(lTrip And clFourMask) 'Mask for the low set.
If lLen = 68 Then 'Ready for a newline
bout(lPos + 4) = 13 'Chr(13) = vbCr
bout(lPos + 5) = 10 'Chr(10) = vbLf
lLen = 0 'Reset the counter
lPos = lPos + 6
Else
lLen = lLen + 4
lPos = lPos + 4
End If
Next lChar

If bout(lOutSize) = 10 Then lOutSize = lOutSize - 2 'Shift the padding chars down if it ends with CrLf.

If iPad = 1 Then 'Add the padding chars if any.
bout(lOutSize) = 61 'Chr(61) = "="
ElseIf iPad = 2 Then
bout(lOutSize) = 61
bout(lOutSize - 1) = 61
End If

Encode64 = StrConv(bout, vbUnicode) 'Convert back to a string and return it.

End Function

Public Function Decode64(sString As String) As String

Dim bout() As Byte, bIn() As Byte, bTrans(255) As Byte, lPowers6(63) As Long, lPowers12(63) As Long
Dim lPowers18(63) As Long, lQuad As Long, iPad As Integer, lChar As Long, lPos As Long, sOut As String
Dim lTemp As Long

sString = Replace(sString, vbCr, vbNullString) 'Get rid of the vbCrLfs. These could be in...
sString = Replace(sString, vbLf, vbNullString) 'either order.

lTemp = StrLen(sString) Mod 4 'Test for valid input.
If lTemp Then
Call Err.Raise(vbObjectError, "MyDecode", "Input string is not valid Base64.")
End If

If InStrRev(sString, "==") Then 'InStrRev is faster when you know it's at the end.
iPad = 2 'Note: These translate to 0, so you can leave them...
ElseIf InStrRev(sString, "=") Then 'in the string and just resize the output.
iPad = 1
End If

For lTemp = 0 To 255 'Fill the translation table.
Select Case lTemp
Case 65 To 90
bTrans(lTemp) = lTemp - 65 'A - Z
Case 97 To 122
bTrans(lTemp) = lTemp - 71 'a - z
Case 48 To 57
bTrans(lTemp) = lTemp + 4 '1 - 0
Case 43
bTrans(lTemp) = 62 'Chr(43) = "+"
Case 47
bTrans(lTemp) = 63 'Chr(47) = "/"
End Select
Next lTemp

For lTemp = 0 To 63 'Fill the 2^6, 2^12, and 2^18 lookup tables.
lPowers6(lTemp) = lTemp * cl2Exp6
lPowers12(lTemp) = lTemp * cl2Exp12
lPowers18(lTemp) = lTemp * cl2Exp18
Next lTemp

bIn = StrConv(sString, vbFromUnicode) 'Load the input byte array.
ReDim bout((((UBound(bIn) + 1) \ 4) * 3) - 1) 'Prepare the output buffer.

For lChar = 0 To UBound(bIn) Step 4
lQuad = lPowers18(bTrans(bIn(lChar))) + lPowers12(bTrans(bIn(lChar + 1))) + _
lPowers6(bTrans(bIn(lChar + 2))) + bTrans(bIn(lChar + 3)) 'Rebuild the bits.
lTemp = lQuad And clHighMask 'Mask for the first byte
bout(lPos) = lTemp \ cl2Exp16 'Shift it down
lTemp = lQuad And clMidMask 'Mask for the second byte
bout(lPos + 1) = lTemp \ cl2Exp8 'Shift it down
bout(lPos + 2) = lQuad And clLowMask 'Mask for the third byte
lPos = lPos + 3
Next lChar

sOut = StrConv(bout, vbUnicode) 'Convert back to a string.
If iPad Then sOut = Left$(sOut, StrLen(sOut) - iPad) 'Chop off any extra bytes.
Decode64 = sOut

End Function

最佳答案

这是在 .net 中使用字符串的 native 函数的方法:

Public Shared Function EncodeString64(instr as string) as String
Return Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(instr))
End function

Public Shared Function DecodeString64(encstr as string) as String
Return ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(encstr))
End function

对于 unicode:

Public Shared Function EncodeString64(instr as string) as String
Return Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(instr))
End function

Public Shared Function DecodeString64(encstr as string) as String
Return System.Text.Encoding.Unicode.GetString(Convert.FromBase64String(encstr))
End function

关于vb.net - VB.NET 中的 Encode64/Decode64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com