1

我有一个char a[]像这样的十六进制字符:

“315c4eeaa8b5f8aaf9174145bf43e1784b8fa00dc71d885a804e5ee9fa40b16349c146fb778cdf2d3aff021dfff5b403b510d0d0455468aeb98622b137dae857553ccd8883a7bc37520e06e515d22c954eba5025b8cc57ee59418ce7dc6bc41556bdb36bbca3e8774301fbcaa3b83b220809560987815f65286764703de0f3d524400a19b159610b11ef3e”

我想将其转换为与每个十六进制数字对应的字母,如下所示:

68656c6c6f = hello

并将其存储,char b[]然后执行相反的操作

我不想要代码块,我想要解释以及使用了哪些库以及如何使用它。

谢谢

4

6 回答 6

2

将十六进制字符串转换为字符串可以通过使用std::substr获取十六进制字符串的下两个字符,然后使用std::stoi将子字符串转换为整数。这可以强制转换为添加到std::string. 该std::stoi函数仅适用于 C++11,如果没有,可以使用 eg std::strtol

要执行相反的操作,您循环输入字符串中的每个字符,将其转换为整数并将其放在std::ostringstream前面的操作符中,以使其显示为两位数零前缀的 十六进制数。附加到输出字符串。

如果需要,用于std::string::c_str获取旧式 Cchar指针。

没有外部库,只使用 C++ 标准库。

于 2012-11-12T13:06:07.897 回答
2

假设你在谈论 ASCII 码。好吧,第一步是找到 的大小b。假设您有 2 个十六进制数字的所有字符(例如, atab将是09),那么 size ofb只是strlen(a) / 2 + 1

完成后,您需要遍历a2 x 2 的字母,将它们转换为整数值并将其存储为字符串。写成一个公式,你有:

b[i] = (to_digit(a[2*i]) << 4) + to_digit(a[2*i+1]))

whereto_digit(x)转换'0'-'9'0-9and'a'-'z''A'-'Z'to 10-15

请注意,如果下面的字符0x10仅显示一个字符(我能想到的唯一一个字符是tab,那么不要使用2*ias index to a,您应该next_index在循环中保留 a ,如果加 2,a[next_index] < '8'否则加 1 。在后一种情况下,b[i] = to_digit(a[next_index])

这个操作的逆过程非常相似。每个字符b[i]都写成:

a[2*i] = to_char(b[i] >> 4)
a[2*i+1] = to_char(b[i] & 0xf)

to_char的对立面在哪里to_digit

于 2012-11-12T13:09:23.427 回答
1

向前:

  1. 从输入中读取两个十六进制字符。
  2. 转换为 int (0..255)。(提示:sscanf 是一种方法)
  3. 将 int 附加到输出 char 数组
  4. 重复 1-3 直到没有字符。
  5. 空终止数组

逆转:

  1. 从数组中读取单个字符
  2. 转换为 2 个十六进制字符(提示:sprintf 是一种方法)。
  3. 从 (2) 连接缓冲区到最终输出字符串缓冲区。
  4. 重复 1-3 直到没有字符。

差点忘了提。仅需要 stdio.h 和常规 C 运行时 - 假设您正在使用sscanfand sprintf. 您也可以创建一对可以从根本上加快转换速度的转换表。

于 2012-11-12T13:09:42.053 回答
0

每个十六进制数字对应 4 位,因为 4 位有 16 个可能的位模式(并且有 16 个可能的十六进制数字,每个代表一个唯一的 4 位模式)。

因此,两个十六进制数字对应 8 位。

在当今的大多数计算机上(一些德州仪器数字信号处理器是一个例外),C++char是 8 位的。

这意味着每个 C++char都由 2 个十六进制数字表示。

因此,只需一次读取两个十六进制数字,转换为int使用例如 an istringstream,将其转换为char,并将每个char值附加到 a std::string

另一个方向正好相反,但有一个扭曲。

因为char在大多数系统上都已签名,所以您需要先转换为,unsigned char然后再将该值转换为十六进制数字。

于 2012-11-12T13:04:12.723 回答
0

可以使用 来完成与十六进制之间的转换hex,例如

cout << hex << x;
cin >> hex >> x;

的合适定义x,例如int x

这也适用于字符串流。

于 2012-11-12T13:11:37.493 回答
0

这是一个简单的代码来解决这个问题:

unsigned int hex_digit_value(char c)
{
    if ('0' <= c && c <= '9') { return c - '0'; }
    if ('a' <= c && c <= 'f') { return c + 10 - 'a'; }
    if ('A' <= c && c <= 'F') { return c + 10 - 'A'; }
    return -1;
}

std::string dehexify(std::string const & s)
{
    std::string result(s.size() / 2);

    for (std::size_t i = 0; i != s.size(); ++i)
    {
        result[i] = hex_digit_value(s[2 * i]) * 16
                  + hex_digit_value(s[2 * i + 1]);
    }

    return result;
}

用法:

char const a[] = "12AB";

std::string s = dehexify(a);

笔记:

  • 正确的实现会添加检查输入字符串长度是否为偶数,并且每个数字实际上是有效的十六进制数字。

  • Dehexifying 与 ASCII 无关。它只是将任何半字节的十六进制序列转换为字节序列。我只是std::string用作一个方便的“字节容器”,这正是它的本质。

  • SO上有几十个答案向您展示如何走另一条路;只需搜索“hexify”。

于 2012-11-12T13:32:27.240 回答