c++ - 在C中将字符串十六进制转换为无符号字符(BYTE)
问题描述
我想将十六进制字符串值转换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);
}
}
输出: 字节[0] --> 0x1B 字节[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("%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
inside的全部价值hex_as_long
。然后,我们使用第一个 print 和第二个 for 循环内的单个字节打印整个 long。我们正在移动 4 位的倍数,因为一个十六进制数字 ( 0xf
) 正好涵盖 4 位数据。
要将字节或长打印到字符串而不是标准输出(如果这是您想要实现的),您可以使用strprintf
或strnprintf
以与使用方式类似的方式printf
使用,但使用变量或数组作为目标。
此解决方案一次扫描整个字节 ( 0xff
)。如果您需要一次处理一个十六进制数字 ( 0xf
),您可以将所有操作除以 2 并使用0xf
而不是0xff
.
推荐阅读
- c# - 在 XElement 中使用“for”循环
- javascript - 检查所有/总和值 - 如何将跨度放在输入中
- java - 在 Java 属性文件中使用值作为键
- java - 将具有负值的 byte[] 转换为 String
- python - 从 oracle (plsql) 运行 .py
- python - ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all():返回具有空值的列
- mongodb - Combine MongoDb clients: pyMongo and MongoEngine
- java - 来自 Lombok 的`@Setter` 的用法
- c# - 如何使用 Microsoft.Management.Infrastructure (MMI) 而不是 System.Management 进行本地 WMI 查询
- php - 复选框使选择输入使用 jquery 所需的 foreach