2

我在十六进制字符串中有这个数字:

002A05.

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

022A05

但它必须适用于每 6 个字符的十六进制数。

我尝试通过 strtol 将十六进制字符串转换为整数,但该函数去除了前导零。

请帮助我如何解决它。

4

4 回答 4

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

希望这可以帮助

于 2012-11-17T11:29:40.213 回答
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”(指向 ideone 的链接)。

于 2012-11-17T11:32:34.630 回答
1

在我看来,您想要操纵一个字符串,而不是十六进制常量。你可以很容易地通过旋转十六进制字符的 ascii 值来做到这一点。如果您有 char 表示 , 或 等十六进制字符char h = '6';char h = 'C';char h = '';可以在字符表示的数字中设置左起第三位(右起第二位):

 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
于 2012-11-17T11:35:58.913 回答
0

您特别询问strtol,因此要回答您的问题,只需在使用以下转换数字后添加填充strtol

const char *s = "002A05";
int x = strtol(s, NULL, 16);
x |= (1<<17);
printf("%.6X\n",x);
于 2012-11-17T11:35:21.750 回答