在 C

时间:2021-04-10 09:02:12

标签: c++ c

我想将十六进制字符串值 0x1B6 转换为 unsigned char - 它将以 0x1B, 0x60 格式存储值我们已经在 C++ 中实现了场景,但 C 不支持 std::stringstream

以下代码是 C++,我如何在 C 中实现类似的行为?

char byte[2];
std::string hexa;
std::string str = "0x1B6" // directly assigned the char* value in to string here 
int index =0;
unsigned int i;

for(i = 2; i < str.length(); i++) {
    hexa = "0x"

    if(str[i + 1] !NULL) {
        hexa = hexa + str[i] + str[i + 1];
        short temp;

        std::istringstream(hexa) >> std::hex >> temp;
        byte[index] = static_cast<BYTE>(temp);
    } else {
        hexa = hexa+ str[i] + "0";
        short temp;
        std::istringstream(hexa) >> std::hex >> temp;
        byte[index] = static_cast<BYTE>(temp);
    }
}
output:
byte[0] --> 0x1B
byte[1]-->  0x60

1 个答案:

答案 0 :(得分:1)

我认为您的解决方案不是很有效。但不管这一点,对于 C,您将使用 strtol。这是如何实现类似目标的示例:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(void) {
    const char *hex_string = "0x1B60";
    long hex_as_long = strtol(hex_string, NULL, 16);
    printf("%lx\n", hex_as_long);

    // From right to left
    for(int i = 0; i < strlen(&hex_string[2]); i += 2) {
        printf("%x\n", (hex_as_long >> (i * 4)) & 0xff);
    }

    printf("---\n");

    // From left to right
    for(int i = strlen(&hex_string[2]) - 2; i >= 0; i -= 2) {
        printf("%x\n", (hex_as_long >> (i * 4)) & 0xff);
    }
}

所以在这里我们得到了 long 内的 hex_as_long 的完整值。然后我们用第一个打印和第二个 for 循环中的单个字节打印整个 long。我们正在移动 4 位的倍数,因为一个十六进制数字 (0xf) 正好涵盖了 4 位数据。

要将字节或长打印到字符串而不是标准输出(如果这是您想要实现的目标),您可以以类似于 strprintfstrnprintf 的方式使用使用了 {1}},但目标是变量或数组。

此解决方案一次扫描整个字节 (printf)。如果您需要一次处理一个十六进制数字 (0xff),您可以将所有操作除以二并使用 0xf 而不是 0xf 进行掩码。