【问题标题】:Using c++ is it possible to convert an Ascii character to Hex?使用 c++ 是否可以将 Ascii 字符转换为十六进制?
【发布时间】:2017-09-11 01:29:32
【问题描述】:

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

sprint(mychararray, %X, myintvalue); 

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

终于想出了解决我问题的方法。首先,我创建了一个数组并将 1 - 256 的所有十六进制值存储在其中。

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

【问题讨论】:

  • 你在寻找什么输出方面
  • 如果你只是想让 0BB8 出现在十六进制编辑器中,你只需要写数字而不是 char 数组,如果你使用 char 数组,你会得到 0BB8 字母的 ascii 值
  • 我假设您正在写入二进制文件,如果您只是写入整数
  • 就输出而言,我需要一个十六进制值,但我不只是想要输出,或者我可以使用 printf。我需要存储该十六进制值,以便我可以使用它。这些值由我的 rpi 作为命令传入。例如,如果一个命令需要一个 16 位无符号整数,我需要将其传递 0x0F8A(一些十六进制值)以便它能够读取它。

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


【解决方案1】:

当我试图理解您的问题时,我意识到您需要的不仅仅是一个变量。你需要一个类,这是因为你希望有一个字符串来表示要打印的十六进制代码,以及数字本身,以无符号 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;
}

我假设你可能想要做一些运算符重载来实现它,这样你就可以从这个数字中加减,或者分配新的数字,或者做任何类型的数学或位移操作。

【讨论】:

  • 有没有办法让这个二进制文件将 3000 作为十六进制值存储在另一个变量(可能是某种数组)中?
  • 我已经更新了我的答案以更适合您的需求,我认为它应该可以解决您的问题
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2015-05-22
  • 2013-12-22
相关资源
最近更新 更多