【问题标题】:Converting hex char array to ascii char array将十六进制字符数组转换为 ascii 字符数组
【发布时间】:2022-01-09 17:13:23
【问题描述】:

有没有可以将十六进制字符数组转换为ASCII字符数组的函数,像这样:

char array_input[] = "48656C6C6F3"; //Input hex sequence
char array_output[] = "Hello";      // Output ASCII

并且可以接受包含超过 300 个字母的输入序列。

类似:

char array_input[] = "08010000013feb55f000000000000f74000f0ea850209a690000940000120000001e09010002000300040016014703f0001504c8000c0900730a00460b00501300464306d7440000b5000bb60007422e9f180000cd0386ce000107c700000000f10000601a46000001344800000bb84900000bb84a00000bb84c00000000024e0000000000000000cf000001";

【问题讨论】:

  • 使用您知道的任何方式来分隔十六进制值并将它们中的每一个转换为char。由于这显然是家庭作业,请展示一些如何解决这个问题。

标签: arrays c hex ascii


【解决方案1】:

一次解析 2 个十六进制数字

遍历输入字符串以查找 2 个十六进制数字。形成 ASCII 值,然后附加到输出数组。追加最后一个空字符

void foo(char *array_output, const char *array_input) {
  unsigned value;
  while (sscanf(array_input, "%2x", &value) == 1) {
    *array_output++ = value;
    array_input += 2;
  } 
  *array_output = '\0';
}

带有空格或" A12-3" 等符号的病态字符串需要额外的代码来处理。


替代方案:使用is...() 测试十六进制数字。然后形成一个复合文字 s 传递给strtol()

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

void foo2(char *array_output, const char *array_input) {
  const unsigned char *h = (const unsigned char *) array_input;
  while (isxdigit(h[0]) && isxdigit(h[1])) {
    char s[3] = { h[0], h[1], '\0' };
    *array_output++ = (char) strtol(s, 0, 16);
    h += 2;
  }
  *array_output = '\0';
}

【讨论】:

  • 您可能会展示如何使用%n 优雅地处理带有嵌入空格的输入字符串,例如"48 65 6C 6C 6F 3",但是十六进制数字对中的空格和嵌入的+ 符号也将被忽略,这可能感到惊讶。输入字符串也可以使用array_input[strcspn(array_input, "0123456789abcdefABCDEF")] == '\0' 进行验证
  • @chqrlie 是的 - 好主意,但 sscanf() 确实有更多缺点(太多)。替代的,更强大的 isxdigit() 已发布。
  • 确实sscanfstrtol 都感觉像使用steam hammer 来压扁一只苍蝇:)
【解决方案2】:

这是一个无需任何库调用的有效替代解决方案:

void hextostr(char *dest, const char *src) {
    static unsigned char const val[(unsigned char)-1+1] = {
        ['0'] =  0+1, ['1'] =  1+1, ['2'] =  2+1, ['3'] =  3+1, ['4'] =  4+1,
        ['5'] =  5+1, ['6'] =  6+1, ['7'] =  7+1, ['8'] =  8+1, ['9'] =  9+1,
        ['a'] = 10+1, ['b'] = 11+1, ['c'] = 12+1, ['d'] = 13+1, ['e'] = 14+1, ['f'] = 15+1,
        ['A'] = 10+1, ['B'] = 11+1, ['C'] = 12+1, ['D'] = 13+1, ['E'] = 14+1, ['F'] = 15+1,
    };
    const unsigned char *p = (const unsigned char *)src;
    while (val[p[0]] && val[p[1]]) {
        *dest++ = (char)(val[p[0]] * 16 + val[p[1]] - 17);
        p += 2;
    }
    *dest = '\0';
}

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2015-01-23
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多