base64加解密算法调用C++ DLL报错
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C++
DLL_EXPORT char* _stdcall encodes(const char *src)
{
int i = 0, j = 0;
int dst_len = 1024*1024;
char *dst = new char[dst_len];
int src_len = strlen(src);
char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
if (src == NULL || src_len == 0 || dst == NULL || dst_len == 0)
{
return NULL;
}
int len = ((src_len + 2) / 3) << 2;
if (dst_len < (len + 1))
{
return NULL;
}
memset(dst, 0, dst_len); // 修改了数组越界的问题
int count = src_len - src_len % 3;
for (; i < count; i += 3)
{
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
dst[j++] = base64_map[src[i + 2] & 0x3F];
}
if (src_len % 3 == 1)
{
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[(src[i] << 4) & 0x30];
dst[j++] = '=';
dst[j++] = '=';
}
else if (src_len % 3 == 2)
{
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
dst[j++] = '=';
}
dst_len = j;
return _strdup(dst);
}
string ret = "武汉理工大学";
string retValue = "";
string retValue1 = "";
//IntPtr ptr = getData();
string ptr = CPPDLL.encodes(ret);
报错 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
[解决办法]
如果是Windows的话,直接用Win32 API就好了。
BOOL fRet= CryptBinaryToString(
(const BYTE*)pSrc, nLenSrc,
CRYPT_STRING_BASE64
[解决办法]
CRYPT_STRING_NOCRLF,
pDst, &nLenOut
);
这有例子:
http://www.experts-exchange.com/Programming/System/Windows__Programming/A_3216-Fast-Base64-Encode-and-Decode.html
[解决办法]
你改不了别人的文件的话 这样处理
在应用处 这样定义
[DllImport("CoderDLL.dll")]
public static extern IntPtr encodes(string des);
string ret = "武汉理工大学";
string retValue = "";
string retValue1 = "";
IntPtr ptr = CPPDLL.encodes(ret);
retValue = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr);
你试试看还报错吗?
一般C++ 传出字符数组 其它语言不能直接用string 接收。
以后凡是
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
一般都是入参或者出参 无法与C++ 对应。你先试试看应该没问题
[解决办法]