-5

可能重复:
在 C++ 中用前导零更改十六进制数的位,(C)

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

002A05(7th bit is set to 0)

我需要反转这个数字的第 7 位,所以转换后我会得到

022A05

但万一

ABCDEF(7th bit is set to 1)

我需要得到

A9CDEF

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

它必须是左起第 7 位。我正在尝试将 OUI 转换为修改后的 EUI64

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

请帮助我如何解决它。

4

4 回答 4

2

最简单的方法,但不一定是最干净的;

由于只有一个字符受到影响,因此您可以使用简单的字符串操作来完成;假设您的输入在字符串中是大写的input

input[1] = "23016745AB*******89EFCD"[input[1]-48];
于 2012-11-19T12:32:41.100 回答
0
#include <stdio.h>

void flipme(char *buf, const char *inBuf)
{
    int x;
    sscanf(inBuf, "%x", &x);
    x ^= 1 << 17;
    sprintf(buf, "%06X", x);
}

int main(void)
{
    char buf[16];

    flipme(buf, "002A05");
    printf("002A05->%s\n", buf);

    flipme(buf, "ABCDEF");
    printf("ABCDEF->%s\n", buf);
}

输出:

002A05->022A05
ABCDEF->A9CDEF

你写了:

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

strtol函数将其转换为数字。说它去掉前导零并没有任何意义,因为数字没有前导零——“6”和“06”是写相同数字的两种不同方式。如果您在打印时想要前导零,则可以添加它们。

于 2012-11-19T12:16:16.300 回答
0
num ^ 0x020000

^是按位异或运算符。

于 2012-11-19T12:18:19.500 回答
0

给定一个整数x,倒置第 3 位的数是x ^ 2。剩下的答案已经给你

注意:在问题中,位从最高到最低计数,从 1 开始。然后 6 位十六进制数的第 7 位是其第二高字符的第 3 位。通常位从最低到最高计数,但从 0 开始。

于 2012-11-19T12:18:37.590 回答