我的目标是能够将unsigned char作为十六进制值返回,这样我就可以将值从客户端传递到服务器端。
在尝试转换为十六进制之前如何生成数据:
unsigned char *TestClass::GetKey()
{
// Generate a key of length 32 bytes
memset(this->szKey, 0, 32);
RAND_bytes(this->szKey, 32);
return this->szKey;
}
这是我目前所获得的:
TestClass myTestClass;
void CJSCallDoc::OnDocumentComplete(LPCTSTR strURL,LPDISPATCH pDisp)
{
unsigned char szKey = hex_print(myTestClass.GetKey());
}
unsigned char CJSCallDoc::hex_print(unsigned char* pv)
{
unsigned char *p = pv;
if (NULL == pv)
{
return NULL;
}
else
{
char storedString[256];
size_t len = strlen((const char*)pv);
size_t i = 0;
for (; i < len; ++i)
{
strcpy_s(storedString, 256, "Test");
strcat_s(storedString, reinterpret_cast<char*>(*p++));
}
return *storedString;
}
}
我遇到的问题是这一行:
strcat_s(storedString, reinterpret_cast<char*>(*p++));
此行导致我的应用程序崩溃,这是我得到的以下错误:
TestApp.exe中0x01664467处的未处理异常:0xC0000005:Access 违规读取位置0x000000FE。
错误将我带到tcscat_s.inl
:
---> while ((*p++ = *_SRC++) != 0 && --available > 0)
{
}
但是,当我尝试执行以下操作时,它可以正常工作:
unsigned char CJSCallDoc::hex_print(unsigned char* pv)
{
unsigned char *p = pv;
if (NULL == pv)
{
return NULL;
}
else
{
char storedString[256];
size_t len = strlen((const char*)pv);
size_t i = 0;
for (; i < len; ++i)
{
strcpy_s(storedString, 256, "Test");
strcat_s(storedString, "WORKS");
}
return *storedString;
}
}
有人可以向我解释一下,我做错了什么,并在正确的方向上给我一些建议吗?
答案 0 :(得分:3)
问题是您要将数据转换为地址,在:
strcat_s(storedString, reinterpret_cast<char*>(*p++));
*p++
等于您的字符串包含的内容 - 您的示例中的第一个元素是p
,因此您将此p
- 十进制值112转换为char*
。 strcat_s
将尝试从此位置读取字符串,该字符串以segfault结尾。