从外部程序读取十六进制值赋值给变量后位运算结果不符合预期的问题排查
问题分析与修复
嘿,我一眼就看出问题出在哪了——你把字符串的首字符直接当成整数赋值给rval3了!
buf里存的是字符串形式的"0x0c10",不是二进制的十六进制数值。当你写int rval3= *buf;的时候,你取的是这个字符串的第一个字符'0',它的ASCII码值是0x30(也就是十进制的48),这就是为什么你输出rval3 = 30的原因,后续的位运算自然得不到正确结果。
修复方法
你需要把字符串形式的十六进制值转换成真正的整数,这里有两种简单可靠的方式:
方式1:用sscanf解析字符串
sscanf可以直接匹配带0x前缀的十六进制字符串,把它转成整数:
// 替换掉原来的int rval3= *buf; int rval3; sscanf(buf, "0x%X", &rval3);
方式2:用strtol转换字符串
strtol是更灵活的字符串转整数函数,支持指定进制:
// 替换掉原来的int rval3= *buf; int rval3 = strtol(buf, NULL, 16); // 16代表按十六进制解析
修复后的代码片段示例
替换后你的代码逻辑就变成这样了:
char *cmd = "/opt/phytool read ps0e0/0xEF/3"; char buf[BUFSIZE]; FILE *fp; if ((fp = popen(cmd, "r")) == NULL) { printf("Error opening pipe!\n"); return -1; } while (fgets(buf, BUFSIZE, fp) != NULL) { printf("OUTPUT: %s", buf); // OUTPUT: 0x0c10 } if (pclose(fp)) { printf("Command not found or exited with error status\n"); return -1; } // 这里替换成正确的转换方式 int rval3; sscanf(buf, "0x%X", &rval3); // 或者用strtol:int rval3 = strtol(buf, NULL, 16); int rev; rev = (rval3 >>10) & 0x7; printf("rval3 = %X\n", rval3); printf("rev = %x\n", rev);
这样处理后,rval3就能正确拿到0x0c10,位运算后的rev就会输出3,和你最初硬编码的结果一致啦。
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

