c - 将 ASCII 字符串数组转换为其十六进制值数组
问题描述
我有一个char
包含 ASCII 字符的数组。我需要知道如何获取每个字符的十六进制值并将其保存在uint8_t
数组中。
例如,如果我有
array[5] = "ABCDE"
输出应该是
output[5] = {0x41, 0x42, 0x43, 0x44, 0x45}
我尝试使用strtol
但没有用。
for(unsigned i = 0; i < 32; i++) {
message[i] = (uint8_t)strtol(&incoming_message[i], NULL, 16);
}
Output:
A 0 0 0 0 0 0 0 0 0 F 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
更新:这是我为Cortex-M0+ 处理器编写的程序。我不只是查看传入的数据,我正在下一步处理这些数据。因此,没有使用printf
解决方案
- Talking C a
char
是可用的最小整数值。 - 谈论 C 和 ASCII 字符文字(如
'A'
)只是值的另一种表示int
(65
此处)。 - Talking Math 还有其他方法可以表示相同的值,除了小数方式(使用基数 10)。一种常见的方法是使用以 16 为底的十六进制方式。
综上所述,证明:
int i = 'A';
char c = i;
是相同的:
int i = 65;
char c = i;
和一样:
int i = 0x41;
char c = i;
和一样:
char c = 'A';
和一样:
char c = 65;
和一样:
char c = 0x41;
所以
char a[5] = "ABCDE";
实际上已经是一个由五个(小)整数组成的整数数组。
如果使用正确的转换说明符和长度修饰符打印,您会看到您所追求的。
for (size_t i = 0; i < 5; ++i)
{
printf("%hhx ", a[i]);
}
输出:
41 42 43 44 45
为了向读者表明这应该被视为十六进制值,可以使用通用0x
符号作为值的前缀
printf("0x%hhx ", a[i]);
这给了你
0x41 0x42 0x43 0x44 0x45
如果您将其展示给 Pascal 人,您可能会使用
printf("$%hhx ", a[i]);
这给了你
$41 $42 $43 $44 $45
看看角色本身就是我们:
printf("%c ", a[i]);
并得到
A B C D E
要查看十进制值,请使用
printf("%d ", a[i]);
并得到
65 66 67 68 69
结论是,这完全取决于您如何表示(“打印”)相同的值(a
元素的内容)。“转换”发生在创建相同值的表示时(通过打印和传递正确的“指令”),即仅在输出期间。
当您仅引用 ASCII 时,这意味着所有值都 <128,因此您可以使用循环复制数组的值
char src[5] = "ABCDE";
uint8_t dst[5];
for (size_t i = 0 i < 5; ++i)
{
dst[i] = src[i];
}
或者通过一次复制相关的内存块
memcpy(dst, src, 5);
推荐阅读
- next.js - Next.js 无法在 getInitialProps 中查询另一个本地服务器
- weblogic - 为什么使用 80 端口无法访问 Weblogic 控制台?
- vue.js - Vue.js - 在 Vue 组件中嵌入 Swagger UI?
- c# - Json反序列化泛型
- tensorflow - 如何在张量流上取消错误检测对象?
- python - 加入带有多索引的熊猫表
- python - 如何在 tkinter 的同一行中获取输出
- vba - 我得到一个编译错误:变量未在后端定义,相同的代码在前端的精确副本中工作
- python - 设置列上的熊猫组并从另一列获取相应的最大值
- mpi - MPI 库可以实现分层并行吗?