【问题标题】:Char string to hex char array in C++ [duplicate]C ++中的字符字符串到十六进制字符数组[重复]
【发布时间】:2019-08-10 07:38:10
【问题描述】:

我有一个 CLinux 设备,我需要转换一些数据。 输入类似于

char mytest[] = "020441010C0000003131203131203131313103";

我需要拥有

mytest2[] = {0x02,0x04,0x41,0x01,0x0C,0x00,0x00,0x00,0x31,0x31,0x20,0x31,0x31,0x20,0x31,0x31,0x31,0x31,0x03}

这是我尝试过的代码,但它无法编译,因为 sstream 不在设备操作系统上。 有人可以给我另一种转换数据的解决方案吗?

#include <iostream>
#include <sstream>


int main() {
std::string myStr = "1122AA010A";

std::stringstream ss;
int n;
for(int i = 0; i<myStr.length(); ) {
    std::istringstream(myStr.substr(i,2))>>std::hex>>n;
    ss<<(char)n;
    i += 2;
    }

std::string result = ss.str();

std::cout<<"\n"<<result<<"\n";
return 0;
}

【问题讨论】:

    标签: c++ hex


    【解决方案1】:

    解析十六进制非常容易。将每个数字转换为其十六进制值,并将它们组合成一个字符。

    int FromHexDigit(char c) //Returns a number from 0 to 15
    {
        if(c >= '0' && c <= '9')
            return c-'0';
        else if(c >= 'A' && c <= 'F')
            return c-'A' + 10;
        else if(c >= 'a' && c <= 'f')
            return c-'a' + 10;
        else
            return -1; //Not a hex digit :(
    }
    

    那么主循环就变成了:

    std::string result;
    for(int i = 0; i<myStr.length(); i += 2) {
        char d1 = myStr[i], d2 = myStr[i+1]; //Those are the two consecutive hex digits
        int n = FromHexDigit(d1)*16 + FromHexDigit(d2); //Convert to a number
        result += (char)n; //Put into the result string
    }
    

    注意 for 循环头中的 i+=2 部分。我们正在处理两个字节块中的字符串。字符串为奇数字符的情况没有处理。

    【讨论】:

    • convert each digit to its hex value 是什么意思?没有办法像使用子字符串一样工作,一次使用 2 位数字? (因为它们已经是十六进制了)
    • @SE-LM 你可以做一个大小为 2 的子字符串,然后用它制作一个字符串,然后以六进制提取,但这要贵得多
    • 将结果放在字符串中很奇怪,vector&lt;unsigned&gt; 或等效项似乎更自然不?
    猜你喜欢
    • 2015-03-09
    • 2012-05-30
    • 2013-11-30
    • 2015-04-14
    • 2011-10-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多