我想将十六进制字符串值 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
答案 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 位数据。
要将字节或长打印到字符串而不是标准输出(如果这是您想要实现的目标),您可以以类似于 strprintf
或 strnprintf
的方式使用使用了 {1}},但目标是变量或数组。
此解决方案一次扫描整个字节 (printf
)。如果您需要一次处理一个十六进制数字 (0xff
),您可以将所有操作除以二并使用 0xf
而不是 0xf
进行掩码。