在C中将字符串十六进制转换为无符号字符(BYTE)



我想将十六进制字符串值0x1B6转换为unsigned 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]-->0x1Bbyte[1]-->0x60

我认为您的解决方案不是很有效。但不管怎样,对于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("%lxn", hex_as_long);
// From right to left
for(int i = 0; i < strlen(&hex_string[2]); i += 2) {
printf("%xn", (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("%xn", (hex_as_long >> (i * 4)) & 0xff);
}
}

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

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

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

最新更新