使用 c++ 是否可以将 ASCII 字符转换为十六进制?

Using c++ is it possible to convert an Ascii character to Hex?

本文关键字:转换 字符 十六进制 ASCII c++ 是否 使用      更新时间:2023-10-16

我编写了一个程序来设置客户端/服务器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] = '')
{
hex_values = '0';
}
else
{
hex_values = hex_array[n];
}
if (hex_array[n+1] = '')
{
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

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

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