2014-12-02 170 views
1

我有一個VBA項目,它執行base64編碼並上傳文件(.xlsm)。Base64編碼文件上傳VB.Net

VBA代碼:

Option Explicit 

Private Const clOneMask = 16515072   '000000 111111 111111 111111 
Private Const clTwoMask = 258048   '111111 000000 111111 111111 
Private Const clThreeMask = 4032   '111111 111111 000000 111111 
Private Const clFourMask = 63    '111111 111111 111111 000000 

Private Const clHighMask = 16711680   '11111111 00000000 00000000 
Private Const clMidMask = 65280    '00000000 11111111 00000000 
Private Const clLowMask = 255    '00000000 00000000 11111111 

Private Const cl2Exp18 = 262144    '2 to the 18th power 
Private Const cl2Exp12 = 4096    '2 to the 12th 
Private Const cl2Exp6 = 64     '2 to the 6th 
Private Const cl2Exp8 = 256     '2 to the 8th 
Private Const cl2Exp16 = 65536    '2 to the 16th 

Private cbTransTo(63) As Byte 
Private cbTransFrom(255) As Byte 
Private clPowers8(255) As Long 
Private clPowers16(255) As Long 
Private clPowers6(63) As Long 
Private clPowers12(63) As Long 
Private clPowers18(63) As Long 

Private Sub Class_Initialize() 

    Dim lTemp As Long 

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

    For lTemp = 0 To 255       'Fill the lookup tables. 
     clPowers8(lTemp) = lTemp * cl2Exp8 
     clPowers16(lTemp) = lTemp * cl2Exp16 
    Next lTemp 

    For lTemp = 0 To 63 
     clPowers6(lTemp) = lTemp * cl2Exp6 
     clPowers12(lTemp) = lTemp * cl2Exp12 
     clPowers18(lTemp) = lTemp * cl2Exp18 
    Next lTemp 

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

End Sub 

Public Function Encode(sString As String) As String 

    Dim bTrans(63) As Byte, bOut() As Byte, bIn() As Byte, lOutSize As Long 
    Dim lChar As Long, lTrip As Long, iPad As Integer, lLen As Long, lTemp As Long, lPos As Long 


    iPad = Len(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 = clPowers16(bIn(lChar)) + clPowers8(bIn(lChar + 1)) + bIn(lChar + 2) 'Combine the 3 bytes 
     lTemp = lTrip And clOneMask      'Mask for the first 6 bits 
     bOut(lPos) = cbTransTo(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) = cbTransTo(lTemp \ cl2Exp12) 'Shift it down and translate. 
     lTemp = lTrip And clThreeMask     'Mask for the third set. 
     bOut(lPos + 2) = cbTransTo(lTemp \ cl2Exp6)  'Shift it down and translate. 
     bOut(lPos + 3) = cbTransTo(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 

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

End Function 

生成的輸出是完全一樣: Required Output

我想實現在VB.Net相同的輸出,但我不能這樣做。我嘗試使用以下:

Dim testStr As String = "test.xlsm" 
Dim byt As Byte() = Encoding.Default.GetBytes(testStr) 
testStr = Convert.ToBase64String(byt) 

輸入字符串:http://txt.do/obff

但我沒有得到完全相同的字符串返回。第一行在兩種情況下都是不同的(VBA和VB.Net),我不知道爲什麼。

所需的輸出(VBA和網絡鏈接):

UEsDBBQABgAIAAAAIQCsmTVRbwEAAD8EAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAA 

生成的輸出(VB.Net)

UEsDBBQABgAIAAAAIQA/PzVRbwEAAD8EAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCA/BAIoPwACAAAAAAAAAAAAAAAAAAAAAAAAA 

可否請你讓我知道我錯了以及如何在VB.Net中實現相同的功能?

+0

什麼是輸入字符串? – 2014-12-02 10:54:50

+0

它是一個excel文件。 (.xlsm),其內容使用IO.FileStream函數讀入字符串。 – Neophile 2014-12-02 10:56:54

+0

你想要我在這裏粘貼代碼嗎? – Neophile 2014-12-02 11:26:07

回答

1

我設法通過直接獲取文件來解決問題,讀取它的所有字節並將其轉換爲base64字符串。

Dim dat As Byte() = IO.File.ReadAllBytes(FileName) 
testStr = Convert.ToBase64String(dat, Base64FormattingOptions.InsertLineBreaks)