我的这个数字是十六进制字符串:
002A05.
我需要将此数字的第7位设置为1,因此转换后我会得到
022A05
但它必须与每6个字符十六进制数一起使用。
我尝试通过strtol将十六进制字符串转换为整数,但该函数会将前导零。
请帮助我如何解决。
答案 0 :(得分:3)
int hex=0x002A05;
int mask = 0x020000;
printf ("%06X",hex | mask);
希望这会有所帮助
答案 1 :(得分:2)
在一个24位数字位#7(从左边开始计数,就像在你的例子中所做的那样,不是从右边开始计算,如常规那样)总是在左边的第二个字节中。您可以解决您的问题,而无需将整个数字转换为整数,方法是取第二个十六进制数字,将其转换为数字0..15,设置其位#3(再次从左侧开始计数),并将结果转换回十六进制数字。
int fromHex(char c) {
c = toupper(c);
if (c >= '0' && c <= '9') {
return c-'0';
} else {
return c-'A'+10;
}
}
char toHexDigit(int n) {
return n < 10 ? '0'+n : 'A'+n-10;
}
char myNum[] = "002A05";
myNum[1] = toHexDigit(fromHex(myNum[1]) | 2);
printf("%s\n", myNum);
这会打印'022A05'(link to ideone)。
答案 2 :(得分:1)
听起来,你有一个字符串,而不是十六进制常量,你想要操纵。你可以通过对十六进制字符的ascii值进行调整来轻松地完成它。如果您有表示char h = '6';
,char h = 'C';
或char h = '';
等十六进制字符的字符,则可以在字符表示的数字中设置左起第3位(右起第2位)使用:
h = h > '7' ? h <= '9' ? h + 9 : ((h + 1) | 2) - 1 : h | 2;
因此,您可以对字符串中的第二个字符(4 + 3位)执行此操作。这适用于任何包含2个或更多字符的十六进制字符串。这是你的例子:
char hex_string[] = "002A05";
// Get the second character from the string
char h = hex_string[1];
// Calculate the new character
h = h > '7' ? h <= '9' ? h + 9 : ((h + 1) | 2) - 1 : h | 2;
// Set the second character in the string to the result
hex_string[1] = h;
printf("%s", hex_string); // 022A05
答案 3 :(得分:0)
您专门询问了strtol
,所以要回答您的问题,只需在使用strtol
转换数字后添加填充:
const char *s = "002A05";
int x = strtol(s, NULL, 16);
x |= (1<<17);
printf("%.6X\n",x);