0

这让我发疯,因为我不知道寻找解决方案的神奇词汇。

我初始化:

unsigned char foo[] = {'0', 'x', '1', '1'};

unsigned char bar[] = {'\0'};

本质上,我希望 bar[0] 等于值 0x11。我怎么做?我觉得很愚蠢,我很确定有一个简单的解决方案,但我无法弄清楚。我试过了

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

但这只是让 bar[0] 的值为 0x30,这是 '0' 字符的 ascii 值。

任何帮助/提示?

4

4 回答 4

4

如果您想将文本值转换为整数,可以通过sscanf函数完成:

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

注意:

  • string实际上有五个字符,因为最后有一个终止零。如果您在上面的未终止数组 {'0', 'x', '1', '1'} 上运行 C-string-expecting 函数,如果会继续处理经过数组的数据,这是您绝对不想要的.
  • 在实际使用外部提供的数据时,您必须检查 sscanf 的返回值,以确保它确实完成了您想做的转换。
于 2012-10-23T07:45:13.087 回答
3

符号'a'将字符转换为ASCII 系统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 };

或者

bar[0] = 0x11;

如果你已经在bar某个地方定义了。

于 2012-10-23T07:44:08.593 回答
2

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

char foo[] = "0x11";
char bar[1];
bar[0] = (char)strtol(foo, NULL, 0);

在您最初的初始化中,foo您错过了尾随\0.

于 2012-10-23T07:51:38.607 回答
0

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

如果要转换:unsigned char foo[] = {'0', 'x', '1', '1'};并将0x11其存储在unsigned char bar[] = {'\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
于 2012-10-23T07:53:37.310 回答