C 如何将4个字符组合成1个字符

C 如何将4个字符组合成1个字符,c,C,这让我快发疯了,因为我不知道寻找解决方案的妙语 我初始化: unsignedcharfoo[]={'0','x','1','1'} 无符号字符条[]={'\0'} 基本上,我希望条[0]等于值0x11。我该怎么做?我觉得自己很愚蠢,我很确定有一个简单的解决办法,但我想不出来。我试过了 memcpy(&bar[0],&foo[0],1) 但这只会使bar[0]的值为0x30,这是“0”字符的ascii值 任何帮助/提示?符号'a'将字符a转换为 所以, unsigned char foo[] =

这让我快发疯了,因为我不知道寻找解决方案的妙语

我初始化:

unsignedcharfoo[]={'0','x','1','1'}

无符号字符条[]={'\0'}

基本上,我希望条[0]等于值0x11。我该怎么做?我觉得自己很愚蠢,我很确定有一个简单的解决办法,但我想不出来。我试过了

memcpy(&bar[0],&foo[0],1)

但这只会使bar[0]的值为0x30,这是“0”字符的ascii值


任何帮助/提示?

符号
'a'
将字符
a
转换为

所以,

unsigned char foo[] = {'0', 'x', '1', '1'};
实际上是

unsigned char foo[] = {48, 120, 49, 49};
或者,用十六进制

unsigned char foo[] = {0x30, 0x78, 0x31, 0x31};
所以,你需要的是

unsigned char bar[] = { 0x11 };


如果您已经在某处定义了

如果要将文本值转换为整数,可以通过函数:

char * string = "0x11";
int numeric;
sscanf(string, "%i", &numeric);
// numeric is now 0x11
请注意:

  • string
    实际上有五个字符,因为末尾有一个终止零。如果在上面的未终止数组{0',x',1',1}上运行C-string-expecting函数,If将继续处理经过该数组的数据,这是您绝对不希望看到的
  • 在实际使用外部提供的数据时,您必须检查sscanf的返回值,以确保它确实实现了您想要的转换

我认为您的问题可能有点表述错误,您可能希望
的第一个元素具有将字符串
foo
转换为十六进制整数时得到的值:

char foo[] = "0x11";
char bar[1];
bar[0] = (char)strtol(foo, NULL, 0);
在最初初始化
foo
时,您错过了尾随的
\0

一种简单的方法:(还有更多)

如果要转换:
unsignedcharfoo[]={'0','x','1','1'}
0x11
中,并将其存储在
无符号字符栏[]={'\0'}执行以下操作:

unsigned char foo[] = {'0', 'x', '1', '1', '\0'};//Add end of string character, to be sure
unsigned char bar[] = {'\0'};//Allocated 1 byte of memory
bar[0]=strtol(foo,NULL,16);//Include stdlib.h. Converts strings to long int and due to assignment, result downgraded to unsigned char

你能解释一下为什么标题是把4个字符合并成1个字符吗?你所需要的只是一个简单的赋值,而不涉及4字节数组,这很奇怪。这是如何回答这个问题的?这里没有解析/转换。我不知道你在问什么,@AlexeyFrunze。如果查找ASCII表,您将看到对应于0x11的字符很难表示为用户可查看的字符。因此,从字符常量转换并不是最好的方法。这直接回答了问题,但也解释了正在发生的事情,以便OP探索语言的工作原理。我认为OP的目的是解析字符串(
'0','x','1','1'
),就像编译器在源代码中看到
0x11
时所做的那样,并用值0x11替换该字符串。顺便说一句,C标准不保证字符是
ASCII
。他们可能是
EBCDIC
,尽管现在这种情况很少见。@AlexeyFrunze,OP可能会选择一个不同的答案,下次再问一个定义更好的问题。您说得对,
ASCII
不能保证,很抱歉。C99标准的第6.4.4.4节指出,“除了后面详述的一些例外,序列的元素是源字符集的任何成员;它们以实现定义的方式映射到执行字符集的成员。”是的,这就是我正在寻找的!非常感谢。我的问题表达得很糟糕,抱歉。@Terence:没问题。它将成为寻找合适词汇的其他人的灯塔:-)
unsigned char foo[] = {'0', 'x', '1', '1', '\0'};//Add end of string character, to be sure
unsigned char bar[] = {'\0'};//Allocated 1 byte of memory
bar[0]=strtol(foo,NULL,16);//Include stdlib.h. Converts strings to long int and due to assignment, result downgraded to unsigned char