我有一个字符串值:
string str = "2018";
现在我必须以十六进制表示形式存储在unsigned char
数组中,但实际上并不能转换为十六进制:
unsigned char data [2]; //[0x20,0x18]
如果我这样做
data[0] = 0x20;
data[1] = 0x18;
它有效,但是我的输入是string
,我该如何解决?
如果我输入的是unsigned char
而不是
string
unsigned char y1 = 20;
unsigned char y2 = 18;
还有更好的方法吗?
答案 0 :(得分:2)
如果您可以假设字符串具有4位数字,则可以通过以下方式简单有效地将其转换为BCD格式:
void convert_to_bcd4(unsigned char *data, const char *str) {
data[0] = (str[0] - '0') * 16 + (str[1] - '0');
data[1] = (str[2] - '0') * 16 + (str[3] - '0');
}
答案 1 :(得分:2)
简短的研究使我发现此功能QString::toInt(bool&, int)
对您的意图很有用。
基本上,您可以:
if(str.size() % 2 == 1){
str = '0' + str;
}
for(int i = 0; i < str.size() / 2; i++){
data[i] = (str[2*i] + str[2*i+1]).toInt(res, 16);
}
我没有尝试过这段代码,肯定有一种更好的方法来提取子字符串,并且可能比迭代它更有效。
答案 2 :(得分:2)
也许您可以尝试这样的事情:
#include <iostream>
int main()
{
std::string s = "2018";
unsigned i;
std::sscanf(s.c_str(), "%04x", &i);
unsigned char data[2];
data[0] = i >> 8;
data[1] = i;
std::cout << std::hex << (int)data[0] << " " << (int)data[1] << std::endl;
return 0;
}
打印:
20 18
答案 3 :(得分:1)
您可以使用十六进制字符串到二进制转换器来完成“ 2018”到0x20 0x18的转换。我认为,例如sscanf(“%x”,....)可以做到这一点。这通常给出一个int值。您可以通过常规方式从int提取字节值。 (此方法不检查错误。)