反转十六进制字符串C++的第 7 位

Invert 7th bit of hex string C++

本文关键字:的第 C++ 字符串 十六进制      更新时间:2023-10-16

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

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

002A05(7th bit is set to 0)

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

022A05

但万一

ABCDEF(7th bit is set to 1)

我需要得到

A9CDEF

但它必须与每 6 个字符的十六进制数一起使用。

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

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

请帮我如何解决它。

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

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

input[1] = "23016745AB*******89EFCD"[input[1]-48];
#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->%sn", buf);
    flipme(buf, "ABCDEF");
    printf("ABCDEF->%sn", buf);
}

输出:

002A05->022A05
ABCDEF->A9CDEF

你写道:

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

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

num ^ 0x020000

^ 是按位异或运算符。

给定一个整数x,第 3 位倒置的数字是 x ^ 2 。其余的答案是之前给你的。

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