将字符串存储为十六进制而不进行转换

时间:2018-07-27 12:04:20

标签: c++ hex

我有一个字符串值:

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;

还有更好的方法吗?

4 个答案:

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

https://ideone.com/SyYKUl

打印:

20 18

答案 3 :(得分:1)

您可以使用十六进制字符串到二进制转换器来完成“ 2018”到0x20 0x18的转换。我认为,例如sscanf(“%x”,....)可以做到这一点。这通常给出一个int值。您可以通过常规方式从int提取字节值。 (此方法不检查错误。)