使用c ++是否可以将Ascii字符转换为Hex?

时间:2017-04-14 18:48:54

标签: c++ arrays raspberry-pi hex ascii

我编写了一个程序,用于设置客户端/服务器TCP套接字,用户通过终端接口向服务器发送整数值。在服务器端,我正在执行字节命令,我需要在数组中存储十六进制值。

sprint(mychararray, %X, myintvalue); 

此代码获取我的整数并将其作为十六进制值打印到char数组中。唯一的问题是,当我使用该数组设置我的命令时,它注册为ascii char。因此,例如,如果我发送一个等于3000的整数,它将转换为0x0BB8,然后存储为'B''B''8',对应于16 42 38十六进制。我已经到处寻找解决方案,并且无法想出一个解决方案。

最后想出了解决问题的方法。首先,我创建了一个数组,并将所有十六进制值保存在其中。

char m_list[256]; //array defined in class
m_list[0] = 0x00; //set first array index to zero
int count = 1; //count variable to step through the array and set members
while (count < 256)
{
    m_list[count] = m_list[count -1] + 0x01; //populate array with hex from 0x00 - 0xFF
    count++;
}

接下来,我创建了一个函数,允许我将十六进制值分组为单个字节并存储到将处理我的命令的数组中。

void parse_input(char hex_array[], int i, char ans_array[])
{
    int n = 0;
    int j = 0;
    int idx = 0;
    string hex_values;
    while (n < i-1)
    {
        if (hex_array[n] = '\0')
        {
            hex_values = '0';
        }
        else
        {
            hex_values = hex_array[n];
        }
        if (hex_array[n+1] = '\0')
        {
            hex_values += '0';
        }
        else
        {
            hex_values += hex_array[n+1];
        }
        cout<<"This is the string being used in stoi: "<<hex_values; //statement for testing
        idx = stoul(hex_values, nullptr, 16);
        ans_array[j] = m_list[idx];
        n = n + 2;
        j++;
    }
}

此功能将在我之前的代码之后立即调用。

sprint(mychararray, %X, myintvalue); 
void parse_input(arrayA, size of arrayA, arrayB) 

示例:arrayA = 8byte char数组,arrayB是4byte char数组。 arrayA应该是arrayB大小的两倍,因为你要获取两个ascii值并生成一个字节对。例如'A''B'= 0xAB

1 个答案:

答案 0 :(得分:0)

当我试图理解你的问题时,我意识到你需要的不仅仅是一个变量。你需要一个类,这是因为你希望有一个表示要打印的十六进制代码的字符串以及一个无符号16位整数形式的数字本身,我推断它将类似于unsigned short int 。所以我创建了一个类,为你做了所有这些名为hexset(我从bitset获得了想法),在这里:

#include <iostream>
#include <string>

class hexset {
 public:
     hexset(int num) {
         this->hexnum = (unsigned short int) num;
         this->hexstring = hexset::to_string(num);
    }

    unsigned short int get_hexnum() {return this->hexnum;}
    std::string get_hexstring() {return this->hexstring;}

 private:
    static std::string to_string(int decimal) {
        int length = int_length(decimal);
        std::string ret = "";
        for (int i = (length > 1 ? int_length(decimal) - 1 : length); i >= 0; i--) {
            ret = hex_arr[decimal%16]+ret;
            decimal /= 16;
        }
        if (ret[0] == '0') {
            ret = ret.substr(1,ret.length()-1);
        }
        return "0x"+ret;
    }

    static int int_length(int num) {
        int ret = 1;
        while (num > 10) {
            num/=10;
            ++ret;
        }
        return ret;
    }

    static constexpr char hex_arr[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    unsigned short int hexnum;
    std::string hexstring;
};

constexpr char hexset::hex_arr[16];

int main() {
    int number_from_file = 3000; // This number is in all forms technically, hex is just another way to represent this number.
    hexset hex(number_from_file);
    std::cout << hex.get_hexstring() << ' ' << hex.get_hexnum() << std::endl;
    return 0;
}

我假设您可能想要进行一些运算符重载以使其可以添加和减去此数字或分配新数字或进行任何类型的数学或位移操作。