Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C语言中的十六进制赋值_C++_C - Fatal编程技术网

C++ C语言中的十六进制赋值

C++ C语言中的十六进制赋值,c++,c,C++,C,我生成了一个长的字节序列,如下所示: 0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F..... 现在,我想把它分配给一个静态的无符号字符x[] 很明显,当我在这里这样做的时候,我得到了十六进制转义序列超出范围的警告 static unsigned char x[] = "\x401DA1815EB56039....."; 它需要的格式是 static unsigned char x[] = "\x40\x1D\xA1\x81\x

我生成了一个长的字节序列,如下所示:

0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F.....
现在,我想把它分配给一个静态的无符号字符x[]

很明显,当我在这里这样做的时候,我得到了十六进制转义序列超出范围的警告

static unsigned char x[] = "\x401DA1815EB56039.....";
它需要的格式是

static unsigned char x[] = "\x40\x1D\xA1\x81\x5E\xB5\x60\x39.....";
所以我想知道,在C语言中,是否有一种不用我添加
每个字节后的十六进制转义序列(可能需要相当长的时间)

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

< P>我不认为有办法把它写成文字。 您可以在运行时解析字符串并将其存储在另一个数组中

您可以使用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
阿福,不


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

如果序列是固定的,我建议遵循编辑器中的regexp建议

如果序列是动态更改的,则可以在运行时相对轻松地对其进行转换

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;
}
[]中的字符=“0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F…”//或者随便什么,从一个文件或类似的东西加载。 字符输出[MAX_LEN]//或malloc()作为l/2或其他任何形式。。。 int l=strlen(in);
对于(int i=2;i='0'&&in='A'&&in='A'&&in'序列从何而来?例如,您不能从文件中读取数据吗?为什么不修改这个很长序列的生成器以按请求的格式输出它呢?您始终可以在vim中执行:
:s/./\\x&/g
(删除
0x
)。或者你最喜欢的编辑器应该有办法做到这一点。听起来像是编辑器/ide宏可以做到这一点。建议:如果可能的话,将生成代码嵌入其中。最好的方法是使用正则表达式应用程序,然后将结果剪切并粘贴到代码中