假设我有一段类似的代码
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++;
}
我正在尝试上面的代码。但无法按要求运行。
答案 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()
的第三个参数如何指定基数(在本例中为十六进制)。