这让我发疯,因为我不知道寻找解决方案的神奇词汇。
我初始化:
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 值。
任何帮助/提示?
这让我发疯,因为我不知道寻找解决方案的神奇词汇。
我初始化:
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 值。
任何帮助/提示?
如果您想将文本值转换为整数,可以通过sscanf函数完成:
char * string = "0x11";
int numeric;
sscanf(string, "%i", &numeric);
// numeric is now 0x11
注意:
string实际上有五个字符,因为最后有一个终止零。如果您在上面的未终止数组 {'0', 'x', '1', '1'} 上运行 C-string-expecting 函数,如果会继续处理经过数组的数据,这是您绝对不想要的.符号'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某个地方定义了。
我认为您的问题表述可能有点错误,您可能希望第一个元素bar具有将字符串转换foo为十六进制整数时获得的值:
char foo[] = "0x11";
char bar[1];
bar[0] = (char)strtol(foo, NULL, 0);
在您最初的初始化中,foo您错过了尾随\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