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 - -!
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 - -!
用W版
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
#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
//]
//