以十六进制值的形式返回无符号字符

Return unsigned char as a hex value

本文关键字:返回 无符号 字符 十六进制      更新时间:2023-10-16

我的目标是能够将无符号字符作为十六进制值返回,这样我就可以将值从客户端传递到服务器端。

如何在尝试转换为十六进制之前生成我的数据:

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;
    }
}

有人能向我解释一下我做错了什么,并给我一些正确的建议吗?

问题是您正在将数据转换为地址,在:中

strcat_s(storedString, reinterpret_cast<char*>(*p++));

*p++等于您的字符串所包含的值——示例中的第一个元素是p,所以您将这个p-十进制值112强制转换为char*strcat_s将尝试从此位置读取字符串,该字符串立即以segfault结束。