我看到CryptStringToBinary Cryptography API 的奇怪行为。
请参阅以下代码(配置:x64 调试):
#include "stdafx.h"
#include <windows.h>
#include <strsafe.h>
#include <iostream>
#include <exception>
void main()
{
DWORD dwSkip;
DWORD dwFlags;
DWORD dwDataLen;
//LPCWSTR pszInput = L"jAAAAAECAAADZgAAAKQAAGdnNL1l56BWGFjDGR3RpxTQqqn6DAw3USv2eMkJYm4t"; //this works fine
LPCWSTR pszInput = L"MyTest"; //doesnt work, API returns false,error code 0x0000000d
// Determine the size of the BYTE array and allocate memory.
if(! CryptStringToBinary(
pszInput,
_tcslen( pszInput ) + 1,
CRYPT_STRING_BASE64,
NULL,
&dwDataLen,
&dwSkip,
&dwFlags ) )
{
DWORD dw = GetLastError(); //0x0000000d: The data is invalid
throw std::exception( "Error computing Byte length." );
}
BYTE *pbyteByte = NULL;
try
{
pbyteByte = new BYTE[ dwDataLen ];
if( !pbyteByte )
{
DWORD m_dwError = ERROR_INVALID_DATA;
throw std::exception( "Wrong array size." );
}
}
catch( std::exception &ex )
{
throw ex;
}
catch(...)
{
throw std::exception( "Out of memory." );
}
return ;
}
对于第一个pszInput
字符串(上面的注释字符串),CryptStringToBinary返回true
. 但如果我L"MyTest"
用作pszInput
字符串,它会返回false
错误代码0x0000000
。
我确实看到,传递给 API 的字符串长度存在一些问题。当我传递没有以空字符终止的字符(removed+1
)的长度时,APItrue
总是返回。但是在这种情况下,BYTE
返回的长度是否正确?
有人可以帮我理解这种行为背后的原因吗?
另外,我对 API 中长度参数的使用是否正确?