c - 将一个数组的十六进制值转换为另一个数组的字符串值
问题描述
我正在尝试将数组的十六进制值转换为另一个数组的字符。这是唯一的方法,我可以找到但不工作。
谢谢您的帮助 !
char tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[12];
for (int i = 0; i < 6; i++) {
printf(" %x", tmp[i]);
sprintf(new + i, "%x", tmp[i]);
}
for (int i = 0; i < 12; i++) {
printf(" %c", new[i]);
}
printf("new: %s\n", new);
这是输出:
81 0 0 0 12 5
8 0 0 0 1 5
new: 800015
所以,它缺少一些字节......
解决方案
大概
char tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[6];
一定是
int tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[6*2+1];
和
sprintf(tmp + i, "%x", tmp[i]);
一定是
sprintf(new + 2*i, "%02x", tmp[i]);
和
for (int i = 0; i < 6; i++) {
printf(" %c", new[i]);
}
一定是
for (int i = 0; i < 6*2; i++) {
printf(" %c", new[i]);
}
执行 :
/tmp % ./a.out
81 0 0 0 12 5 8 1 0 0 0 0 0 0 1 2 0 5new: 810000001205
在valgrind下:
/tmp % valgrind ./a.out
==15557== Memcheck, a memory error detector
==15557== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==15557== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==15557== Command: ./a.out
==15557==
81 0 0 0 12 5 8 1 0 0 0 0 0 0 1 2 0 5new: 810000001205
==15557==
==15557== HEAP SUMMARY:
==15557== in use at exit: 0 bytes in 0 blocks
==15557== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==15557==
==15557== All heap blocks were freed -- no leaks are possible
==15557==
==15557== For counts of detected and suppressed errors, rerun with: -v
==15557== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
推荐阅读
- java - 将图像转换为 json 文件中的 Base64 问题
- c# - 重构项目以使用不同的 SDK
- pandas - 如何返回在其他列 Pandas 中有多个条目的元素
- c# - 在 C# 中获取即时时间的最佳方法是什么?
- jquery - 如何根据控制器的查询结果显示警报?
- mysql - xmalloc:无法分配 16 个字节将 mysql 数据库从 1 个远程复制到另一个
- scala - spark-cassandra-connector 是否支持内置负载平衡?
- asp.net - 控制器中的 ASP.NET MVC5 代码事件应重新加载视图
- c# - Xamarin 页面不包含定义
- c++ - 包含时 C++ ZBar cmake 错误“找不到文件”