用unsigned char十六进制

时间:2019-12-30 09:38:53

标签: c++ c bit-manipulation

假设我有一段类似的代码

unsigned char *tag = NULL;
tag = (unsigned char *)malloc(8);
memset(tag, 0, 8);
memcpy(tag, (const char *)"50C59390",8);

我必须将其发送为长度4。因此,我试图将其转换为4字节的十六进制,例如0x50C59390。

unsigned char * buffer = (unsigned char *)calloc(4, sizeof(char));
int index,j = 0;
for(index = 0 ; index < 8; index++)
{        
    buffer[j] = (tag[index] & 0x0F) | (tag[++index]>>4 & 0xF0);
    printf("%02X", buffer[j]);
    j++;
}

我正在尝试上面的代码。但无法按要求运行。

2 个答案:

答案 0 :(得分:2)

您不能仅将ascii字符复制为十六进制值。您需要对其进行转换。

类似的东西:

unsigned char convert(unsigned char ch)
{
    if (ch >= '0' && ch <= '9')
    {
        return ch -'0';
    }

    if (ch >= 'a' && ch <= 'f')
    {
        return ch -'a' + 10;
    }

    if (ch >= 'A' && ch <= 'F')
    {
        return ch -'A' + 10;
    }

    return 0; // or some error handling
}

并像这样使用它:

for(index = 0 ; index < 8; index = index + 2)
{   
    buffer[j] = convert(tag[index]) << 4;
    buffer[j] += convert(tag[index+1]);

    printf("%02X", buffer[j]);
    j++;
}

在此处在线查看:https://ideone.com/e2FPCT

答案 1 :(得分:0)

根据您的问题,我不确定您是尝试转换为字符串还是转换为字符串。但是,如果您有C ++ 11,则可以使用std::stoi()std::to_string()进行轻松转换:

int hex_value = std::stoi(tag, nullptr, 16)

请注意std::stoi()的第三个参数如何指定基数(在本例中为十六进制)。

相关问题