mbstowcs_s 函数有时调整大小 return 输入长度 + 1
mbstowcs_s function retsize sometimes return input length + 1
我在 Windows 7.
上使用 VisualStdio 2010
我想使用函数解密密码并将解密结果显示为TCHAR*
。
这里实现,
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
char* _decrypt_password_v1(const char* strPassword);
char Hash_v1(const char chhash, int nIndex);
#define VIT_PASSWORD _decrypt_password_v1("OOWIEJFOISJDFNPPAJ")
char* _decrypt_password_v1(const char* strPassword)
{
unsigned int i = 0;
char* strDecrypt = (char*)malloc(strlen(strPassword) + 1);
memset(strDecrypt, 0x00, strlen(strPassword) + 1);
int nLen = strlen(strPassword) -1;
for (int i = 0; i < nLen; i++)
{
strDecrypt[i] = Hash_v1(strPassword[nLen - i], nLen - 1);
}
strDecrypt[i] = NULL;
return strDecrypt;
}
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szPassword[MAX_PATH] = {0};
int nLen = strlen(VIT_PASSWORD);
_tprintf(_T("Input Password Len : %d\n"), nLen);
size_t outSize;
mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD), VIT_PASSWORD, strlen(VIT_PASSWORD));
_tprintf(_T("Password : %s\n"), szPassword);
return 0;
}
如果我运行这段代码,我会报错
Debug Assertion Failed!
File: f:\dd\vctools\crt_bld\self_x86\crt\src\mbstowcs.c
Line: 283
Expression: retsize <= sizeInWords
所以,我把mbstowcs_s
的参数3增加到strlen(VIT_PASSWORD) + 1
。
更正后的代码:
mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD) + 1, VIT_PASSWORD, strlen(VIT_PASSWORD));
然后没有崩溃并且 运行 正确,但是 sizeInWords
是 strlen(VIT_PASSWORD)
,而不是 strlen(VIT_PASSWORD) + 1
。
如果我改用mbstowcs
,就没有错误。像这样 mbstowcs(szPassword, VIT_PASSWORD, strlen(VIT_PASSWORD));
为什么会这样?如果答案不明确,我不得不这样修改我整个代码的这部分。
我需要具体的答案。
mbtowcs_s
的第三个参数应该是 wchar_t
s 中第二个参数指向的缓冲区的大小,所以在你的情况下它应该是 MAX_PATH
.
mbtowcs_s
的要点是确保您向目标写入的字符数不会超过 space 的字符数。这就是第三个参数的作用:告诉它你有多少space。在这种情况下,如果 VIT_PASSWORD
中没有非 ASCII 字符,目标将需要相同数量的 wchar_t
来保存转换后的字符串。因此,如果 VIT_PASSWORD
的长度为 4 个字符,加上 nul 终止符,那么 mbtowcs_s
的第三个参数将需要至少为 5 才能成功转换字符串(4 个字符加上 nul 终止符)。问题是 strlen(VIT_PASSWORD)
将 return 4,而不是 5,因为它不计算空终止符。
我在 Windows 7.
上使用 VisualStdio 2010我想使用函数解密密码并将解密结果显示为TCHAR*
。
这里实现,
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
char* _decrypt_password_v1(const char* strPassword);
char Hash_v1(const char chhash, int nIndex);
#define VIT_PASSWORD _decrypt_password_v1("OOWIEJFOISJDFNPPAJ")
char* _decrypt_password_v1(const char* strPassword)
{
unsigned int i = 0;
char* strDecrypt = (char*)malloc(strlen(strPassword) + 1);
memset(strDecrypt, 0x00, strlen(strPassword) + 1);
int nLen = strlen(strPassword) -1;
for (int i = 0; i < nLen; i++)
{
strDecrypt[i] = Hash_v1(strPassword[nLen - i], nLen - 1);
}
strDecrypt[i] = NULL;
return strDecrypt;
}
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szPassword[MAX_PATH] = {0};
int nLen = strlen(VIT_PASSWORD);
_tprintf(_T("Input Password Len : %d\n"), nLen);
size_t outSize;
mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD), VIT_PASSWORD, strlen(VIT_PASSWORD));
_tprintf(_T("Password : %s\n"), szPassword);
return 0;
}
如果我运行这段代码,我会报错
Debug Assertion Failed!
File: f:\dd\vctools\crt_bld\self_x86\crt\src\mbstowcs.c
Line: 283
Expression: retsize <= sizeInWords
所以,我把mbstowcs_s
的参数3增加到strlen(VIT_PASSWORD) + 1
。
更正后的代码:
mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD) + 1, VIT_PASSWORD, strlen(VIT_PASSWORD));
然后没有崩溃并且 运行 正确,但是 sizeInWords
是 strlen(VIT_PASSWORD)
,而不是 strlen(VIT_PASSWORD) + 1
。
如果我改用mbstowcs
,就没有错误。像这样 mbstowcs(szPassword, VIT_PASSWORD, strlen(VIT_PASSWORD));
为什么会这样?如果答案不明确,我不得不这样修改我整个代码的这部分。
我需要具体的答案。
mbtowcs_s
的第三个参数应该是 wchar_t
s 中第二个参数指向的缓冲区的大小,所以在你的情况下它应该是 MAX_PATH
.
mbtowcs_s
的要点是确保您向目标写入的字符数不会超过 space 的字符数。这就是第三个参数的作用:告诉它你有多少space。在这种情况下,如果 VIT_PASSWORD
中没有非 ASCII 字符,目标将需要相同数量的 wchar_t
来保存转换后的字符串。因此,如果 VIT_PASSWORD
的长度为 4 个字符,加上 nul 终止符,那么 mbtowcs_s
的第三个参数将需要至少为 5 才能成功转换字符串(4 个字符加上 nul 终止符)。问题是 strlen(VIT_PASSWORD)
将 return 4,而不是 5,因为它不计算空终止符。