用C ++中的前导零改变hex数位,(C)

我有hex字符串中的这个数字:

002A05. 

我需要将这个数字的第7位设置为1,所以转换后我会得到

 022A05 

但它必须与每6个字符hex数一起使用。

我尝试通过strtol将hex字符串转换为整数,但该函数条带前导零。

请帮帮我怎样才能解决。

在一个24位数位#7(从左边开始计数,就像在你的例子中所做的那样,不是从右边开始计算,如常规那样)总是在左边的第二个字节中。 您可以通过取第二个hex数字,将整数转换为数字0到15,设置其位#3(从左侧再次计数),并将结果转换回hex来解决您的问题而不将整数转换为整数数字。

 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'( 链接到ideone )。

 int hex=0x002A05; int mask = 0x020000; printf ("%06X",hex | mask); 

希望这可以帮助

对我来说听起来像你有一个字符串,而不是一个hex常量,你想要操纵。 您可以通过对hex字符的ascii值进行调整来轻松完成。 如果你有char代表一个hex字符,如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个或更多字符的hex字符串。 这是你的例子:

 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 

你特意询问了strtol ,所以要回答你的问题,只需在用strtol转换数字后添加填充:

 const char *s = "002A05"; int x = strtol(s, NULL, 16); x |= (1<<17); printf("%.6X\n",x);