首页 > 解决方案 > 在C中将字符串十六进制转换为无符号字符(BYTE)

问题描述

我想将十六进制字符串值转换0x1B6unsigned char- 它将以格式存储值的位置0x1B0x60我们已经在 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);
    }
}
输出:
字节[0] --> 0x1B
字节[1]--> 0x60

标签: c++c

解决方案


我认为您的解决方案效率不高。但不管这一点,使用 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);
    }
}

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

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

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


推荐阅读