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 - -!
uj5u.com熱心網友回復:
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版
uj5u.com熱心網友回復:
用了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 Sub
Private 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
uj5u.com熱心網友回復:
僅供參考#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
//]
//
uj5u.com熱心網友回復:
Byref pcchString As Long,這個是要回傳長度的,傳地址才能回傳轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/101089.html
標籤:API
