C中的HEX分配

时间:2010-01-28 10:36:41

标签: c++ c

我生成了一长串字节,如下所示:

0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F.....

现在,我想将它分配给一个静态的unsigned char x []。

显然,当我在这里执行此操作时,我收到十六进制转义序列超出范围的警告

static unsigned char x[] = "\x401DA1815EB56039.....";

它需要的格式是

static unsigned char x[] = "\x40\x1D\xA1\x81\x5E\xB5\x60\x39.....";

所以我想知道在C中是否有一种方法可以在没有我添加的情况下完成此任务 每个字节后的十六进制转义序列(可能需要一段时间)

4 个答案:

答案 0 :(得分:7)

我认为没有办法从中获取文字。

您可以在运行时解析字符串并将其存储在另一个数组中。

您可以使用sed或其他内容重写序列:

echo 401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F | sed -e 's/../\\x&/g'
\x40\x1D\xA1\x81\x5E\xB5\x60\x39\x9F\xE3\x65\xDA\x23\xAA\xC0\x75\x7F\x1D\x61\xEC\x10\x83\x9D\x9B\x55\x21F

答案 1 :(得分:4)

AFAIK,No。

但您可以使用正则表达式s/(..)/\\x$1/g将序列转换为最后一种格式。

答案 2 :(得分:2)

在C或C ++中没有办法做到这一点。显而易见的解决方案是编写一个程序,将'\ x'序列插入字符串中的正确位置。这对于像perl这样的脚本语言来说是一个合适的任务,但你也可以用C或C ++轻松完成。

答案 3 :(得分:2)

如果序列已修复,我建议遵循编辑器中的regexp-in-editor建议。

如果序列动态变化,您可以在运行时相对容易地转换它。

char in[]="0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F..."; //or whatever, loaded from a file or such.

char out[MAX_LEN]; //or malloc() as l/2 or whatever...

int l = strlen(in);
for(int i=2;i<l;i+=2)
{
    out[i/2-1]=16*AsciiAsHex(in[i])+AsciiAsHex(in[i]+1);
}
out[i/2-1]='\0';
...

int AsciiAsHex(char in)
{
   if(in>='0' && in<='9') return in-'0';
   if(in>='A' && in<='F') return in+10-'A';
   if(in>='a' && in<='f') return in+10-'a';
   return 0;
}