Private Declare Function CryptBinaryToStringA Lib "crypt32.dll" (ByRef pbBinary() As Byte, ByVal cbBinary As Long, ByVal dwFlags As Long, ByVal pszString As String, ByVal pcchString As String) As Long
Private Declare Function CryptBinaryToStringW Lib "crypt32.dll" (ByRef pbBinary() As Byte, ByVal cbBinary As Long, ByVal dwFlags As Long, ByVal pszString As String, ByVal pcchString As String) As Long
Private Declare Function CryptStringToBinaryA Lib "crypt32.dll" (ByVal pszString As Long, ByVal cchString As Long, ByVal dwFlags As Long, ByVal pbBinary As Long, ByVal pcbBinary As Long, ByVal pdwSkip As Long, ByVal pdwFlags As Long) As Long
Private Const CRYPT_STRING_BASE64 = &H1'https://msdn.microsoft.com/en-us/library/aa379887(v=vs.85).aspx
    'static CStringA Encode (const void* pBuffer, DWORD nSize)
   ' {
    '    DWORD   nNeed = 0 ;
    '    CryptBinaryToStringA ((const BYTE*)pBuffer, nSize, CRYPT_STRING_BASE64, NULL, &nNeed) ;    '    CStringA   s ;
    '    if (nNeed)
     '   {
     '       std::vector<char>   buf (nNeed) ;
     '       CryptBinaryToStringA ((const BYTE*)pBuffer, nSize, CRYPT_STRING_BASE64, &buf[0], &nNeed) ;
     '       s = &buf[0] ;
    '    }
   '     s.Replace ("\r\n", "") ; // default will add CR/LF
   '     return s ;
   ' }  '  static void Decode (const char* sBase64, std::vector<BYTE>& decoded_data)
  '  {
  '      decoded_data.clear() ;  '      if (sBase64)
  '      {
   '         DWORD   nNeed = 0 ;
  '          CryptStringToBinaryA (sBase64, 0, CRYPT_STRING_BASE64, NULL, &nNeed, NULL, NULL) ;
  '          if (nNeed)
  '          {
  '              decoded_data.resize (nNeed) ;
  '              CryptStringToBinaryA (sBase64, 0, CRYPT_STRING_BASE64, &decoded_data[0], &nNeed, NULL, NULL) ;
  '          }
  '      }
  '  }
Private Sub Command1_Click()
Decode "5oiR5piv5ZWK"
End Sub
Public Function Decode(sBase64 As String)
Dim nNeed As Long
Call CryptStringToBinaryA(ByVal StrPtr(sBase64), 0, CRYPT_STRING_BASE64, 0&, nNeed&, 0&, 0&) '这句运行出错了.
'MsgBox nNeed&
End Function
用CryptStringToBinaryW返回的是 0 - -!

解决方案 »

  1.   

    Private Declare Function CryptStringToBinaryW Lib "crypt32.dll" (ByVal pszString As Long, ByVal cchString As Long, ByVal dwFlags As Long, ByVal pbBinary As Long, Byref pcbBinary As Long, ByVal pdwSkip As Long, ByVal pdwFlags As Long) As Long
    用W版
      

  2.   

    用了W版. 反过来转换,  CryptBinaryToStringW 又出错了.Private Declare Function CryptBinaryToStringW Lib "crypt32.dll" (ByRef pbBinary As Long, ByVal cbBinary As Long, ByVal dwFlags As Long, ByVal pszString As Long, ByVal pcchString As Long) As Long
    Private Declare Function CryptStringToBinaryW Lib "crypt32.dll" (ByVal pszString As Long, ByVal cchString As Long, ByVal dwFlags As Long, ByVal pbBinary As Long, ByRef pcbBinary As Long, ByVal pdwSkip As Long, ByVal pdwFlags As Long) As Long
    Private Const CRYPT_STRING_BASE64 = &H1'https://msdn.microsoft.com/en-us/library/aa379887(v=vs.85).aspx
        'static CStringA Encode (const void* pBuffer, DWORD nSize)
       ' {
        '    DWORD   nNeed = 0 ;
        '    CryptBinaryToStringA ((const BYTE*)pBuffer, nSize, CRYPT_STRING_BASE64, NULL, &nNeed) ;    '    CStringA   s ;
        '    if (nNeed)
         '   {
         '       std::vector<char>   buf (nNeed) ;
         '       CryptBinaryToStringA ((const BYTE*)pBuffer, nSize, CRYPT_STRING_BASE64, &buf[0], &nNeed) ;
         '       s = &buf[0] ;
        '    }
       '     s.Replace ("\r\n", "") ; // default will add CR/LF
       '     return s ;
       ' }  '  static void Decode (const char* sBase64, std::vector<BYTE>& decoded_data)
      '  {
      '      decoded_data.clear() ;  '      if (sBase64)
      '      {
       '         DWORD   nNeed = 0 ;
      '          CryptStringToBinaryA (sBase64, 0, CRYPT_STRING_BASE64, NULL, &nNeed, NULL, NULL) ;
      '          if (nNeed)
      '          {
      '              decoded_data.resize (nNeed) ;
      '              CryptStringToBinaryA (sBase64, 0, CRYPT_STRING_BASE64, &decoded_data[0], &nNeed, NULL, NULL) ;
      '          }
      '      }
      '  }
    Private Sub Command1_Click()
    Decode "5piv"
    End SubPrivate Sub Command2_Click()
    Dim StrS(2) As Byte
    StrS(0) = &HE6
    StrS(1) = &H98
    StrS(2) = &HAF
    Encode StrS, 3
    End Sub
    Public Function Decode(sBase64 As String) '这函数可以了.
    Dim nNeed As Long
    Dim Str() As Byte
    Call CryptStringToBinaryW(ByVal StrPtr(sBase64), 0, CRYPT_STRING_BASE64, 0&, nNeed&, 0&, 0&)If nNeed > 0 Then
    ReDim Str(nNeed - 1) As Byte
    Call CryptStringToBinaryW(ByVal StrPtr(sBase64), 0, CRYPT_STRING_BASE64, ByVal VarPtr(Str(0)), nNeed&, 0&, 0&)
    End If
    Decode = Str
    End Function
    Public Function Encode(ByRef Str() As Byte, nSize As Long)
    Dim nNeed As Long
    nNeed = 0
    Call CryptBinaryToStringW(ByVal VarPtr(Str(0)), nSize, CRYPT_STRING_BASE64, 0&, nNeed&) '现在这句出错了...
    MsgBox nNeed&
    End Function
      

  3.   

    仅供参考#pragma comment(lib,"crypt32")
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>//+-------------------------------------------------------------------------
    // convert formatted string to binary
    // If cchString is 0, then pszString is NULL terminated and
    // cchString is obtained via strlen() + 1.
    // dwFlags defines string format
    // if pbBinary is NULL, *pcbBinary returns the size of required memory
    // *pdwSkip returns the character count of skipped strings, optional
    // *pdwFlags returns the actual format used in the conversion, optional
    //--------------------------------------------------------------------------
    BOOL
    WINAPI
    CryptStringToBinaryA(
        IN     LPCSTR  pszString,
        IN     DWORD     cchString,
        IN     DWORD     dwFlags,
        IN     BYTE     *pbBinary,
        IN OUT DWORD    *pcbBinary,
        OUT    DWORD    *pdwSkip,    //OPTIONAL
        OUT    DWORD    *pdwFlags    //OPTIONAL
        );
    //+-------------------------------------------------------------------------
    // convert formatted string to binary
    // If cchString is 0, then pszString is NULL terminated and
    // cchString is obtained via strlen() + 1.
    // dwFlags defines string format
    // if pbBinary is NULL, *pcbBinary returns the size of required memory
    // *pdwSkip returns the character count of skipped strings, optional
    // *pdwFlags returns the actual format used in the conversion, optional
    //--------------------------------------------------------------------------
    BOOL
    WINAPI
    CryptStringToBinaryW(
        IN     LPCWSTR  pszString,
        IN     DWORD     cchString,
        IN     DWORD     dwFlags,
        IN     BYTE     *pbBinary,
        IN OUT DWORD    *pcbBinary,
        OUT    DWORD    *pdwSkip,    //OPTIONAL
        OUT    DWORD    *pdwFlags    //OPTIONAL
        );
    #ifdef UNICODE
    #define CryptStringToBinary  CryptStringToBinaryW
    #else
    #define CryptStringToBinary  CryptStringToBinaryA
    #endif // !UNICODE//+-------------------------------------------------------------------------
    // convert binary to formatted string
    // dwFlags defines string format
    // if pszString is NULL, *pcchString returns the size of required memory in byte
    //--------------------------------------------------------------------------
    BOOL
    WINAPI
    CryptBinaryToStringA(
        IN     CONST BYTE  *pbBinary,
        IN     DWORD        cbBinary,
        IN     DWORD        dwFlags,
        IN     LPSTR      pszString,
        IN OUT DWORD       *pcchString
        );
    //+-------------------------------------------------------------------------
    // convert binary to formatted string
    // dwFlags defines string format
    // if pszString is NULL, *pcchString returns the size of required memory in byte
    //--------------------------------------------------------------------------
    BOOL
    WINAPI
    CryptBinaryToStringW(
        IN     CONST BYTE  *pbBinary,
        IN     DWORD        cbBinary,
        IN     DWORD        dwFlags,
        IN     LPWSTR      pszString,
        IN OUT DWORD       *pcchString
        );
    #ifdef UNICODE
    #define CryptBinaryToString  CryptBinaryToStringW
    #else
    #define CryptBinaryToString  CryptBinaryToStringA
    #endif // !UNICODE// dwFlags has the following defines
    #define CRYPT_STRING_BASE64HEADER           0x00000000
    #define CRYPT_STRING_BASE64                 0x00000001
    #define CRYPT_STRING_BINARY                 0x00000002
    #define CRYPT_STRING_BASE64REQUESTHEADER    0x00000003
    #define CRYPT_STRING_HEX                    0x00000004
    #define CRYPT_STRING_HEXASCII               0x00000005
    #define CRYPT_STRING_BASE64_ANY             0x00000006
    #define CRYPT_STRING_ANY                    0x00000007
    #define CRYPT_STRING_HEX_ANY                0x00000008
    #define CRYPT_STRING_BASE64X509CRLHEADER    0x00000009
    #define CRYPT_STRING_HEXADDR                0x0000000a
    #define CRYPT_STRING_HEXASCIIADDR           0x0000000b#define CRYPT_STRING_NOCR                   0x80000000// CryptBinaryToString uses the following flags
    // CRYPT_STRING_BASE64HEADER - base64 format with certificate begin
    //                             and end headers
    // CRYPT_STRING_BASE64 - only base64 without headers
    // CRYPT_STRING_BINARY - pure binary copy
    // CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin
    //                                    and end headers
    // CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin
    //                                    and end headers
    // CRYPT_STRING_HEX - only hex format
    // CRYPT_STRING_HEXASCII - hex format with ascii char display
    // CRYPT_STRING_HEXADDR - hex format with address display
    // CRYPT_STRING_HEXASCIIADDR - hex format with ascii char and address display
    //
    // CryptBinaryToString accepts CRYPT_STRING_NOCR or'd into one of the above.
    // When set, line breaks contain only LF, instead of CR-LF pairs.// CryptStringToBinary uses the following flags
    // CRYPT_STRING_BASE64_ANY tries the following, in order:
    //    CRYPT_STRING_BASE64HEADER
    //    CRYPT_STRING_BASE64
    // CRYPT_STRING_ANY tries the following, in order:
    //    CRYPT_STRING_BASE64_ANY
    //    CRYPT_STRING_BINARY -- should always succeed
    // CRYPT_STRING_HEX_ANY tries the following, in order:
    //    CRYPT_STRING_HEXADDR
    //    CRYPT_STRING_HEXASCIIADDR
    //    CRYPT_STRING_HEXASCII
    //    CRYPT_STRING_HEX
    char *flags[12]={
    "CRYPT_STRING_BASE64HEADER",
    "CRYPT_STRING_BASE64",
    "CRYPT_STRING_BINARY",
    "CRYPT_STRING_BASE64REQUESTHEADER",
    "CRYPT_STRING_HEX",
    "CRYPT_STRING_HEXASCII",
    "CRYPT_STRING_BASE64_ANY",
    "CRYPT_STRING_ANY",
    "CRYPT_STRING_HEX_ANY",
    "CRYPT_STRING_BASE64X509CRLHEADER",
    "CRYPT_STRING_HEXADDR",
    "CRYPT_STRING_HEXASCIIADDR",
    };
    #define MAXC 1024
    BYTE b[22]={
    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
    0x41,0x42,0xB0,0xA1,0x4A,0x55,
    };
    BOOL r;
    DWORD len,dwFlags;
    TCHAR s[MAXC];
    int _tmain() {
        _tprintf(_T("API CryptBinaryToString in crypt32.dll Demonstration:\n"));
        for (dwFlags=0;dwFlags<12;dwFlags++) {
            if (dwFlags==2
             || dwFlags==6
             || dwFlags==7
             || dwFlags==8) continue;
            r=CryptBinaryToString(b,22,dwFlags,NULL,&len);
            if (!r) {
                _tprintf(_T("CryptBinaryToString error!\n"));
                return 1;
            }
            if (len>MAXC) {
                _tprintf(_T("%d==len>MAXC==%d!\n"),len,MAXC);
                return 2;
            }
            r=CryptBinaryToString(b,22,dwFlags,s,&len);
            if (!r) {
                _tprintf(_T("CryptBinaryToString error!\n"));
                return 3;
            }
            _tprintf(_T("\n%s:[\n%s]\n"),flags[dwFlags],s);
        }
        return 0;
    }
    //API CryptBinaryToString in crypt32.dll Demonstration:
    //
    //CRYPT_STRING_BASE64HEADER:[
    //-----BEGIN CERTIFICATE-----
    //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
    //-----END CERTIFICATE-----
    //]
    //
    //CRYPT_STRING_BASE64:[
    //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
    //]
    //
    //CRYPT_STRING_BASE64REQUESTHEADER:[
    //-----BEGIN NEW CERTIFICATE REQUEST-----
    //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
    //-----END NEW CERTIFICATE REQUEST-----
    //]
    //
    //CRYPT_STRING_HEX:[
    //        00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f
    //        41 42 b0 a1 4a 55
    //]
    //
    //CRYPT_STRING_HEXASCII:[
    //        00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f   ................
    //        41 42 b0 a1 4a 55                                  AB..JU
    //]
    //
    //CRYPT_STRING_BASE64X509CRLHEADER:[
    //-----BEGIN X509 CRL-----
    //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
    //-----END X509 CRL-----
    //]
    //
    //CRYPT_STRING_HEXADDR:[
    //0000    00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f
    //0010    41 42 b0 a1 4a 55
    //]
    //
    //CRYPT_STRING_HEXASCIIADDR:[
    //0000    00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f   ................
    //0010    41 42 b0 a1 4a 55                                  AB..JU
    //]
    //
      

  4.   

    Byref pcchString As Long,这个是要返回长度的,传地址才能返回