我想在字符串中存储uint8_t(也可以更改为uint_16或32)。我需要将它们格式化为十六进制,并希望将它们与格式一起存储。 我有类似的东西(只是核心):
uint8_t telegramData[];
for (int i = 0; i < sizeof(telegram); i++)
{
printf("Uint8_t: %02X", telegramData[i]);
}
示例输出:Uint8_t:C8 4A 00 0D
而不是打印出来应该存储,但格式正确。 如果我以结果为例,那将是最好的:string str =“C8 4A 00 0D” 这有什么方法吗?非常感谢提前!
EDITED
你好, 好像我发现了。 我正在使用C ++,抱歉我觉得make标签有误。我正在使用g ++编译器。 电报与此无关(是的,它有适当的大小,在此之前没有注意 - “核心代码”)。 最后使用了sprintf,这对我来说似乎是一个解决方案(再次只是核心,因为需要花费太多来解释每个细节): 请不要咬我的头,我不是最好的编码。
uint8_t telegram;
char *tmp = (char*)malloc(sizeof(telegram));
for (int i = 0; i < sizeof(telegram); i++)
{
sprintf (tmp + strlen(tmp), " %02X", telegram[i]);
}
printf ("Uint8_t: %s",tmp);
输出结果:Uint8_t:C8 4A 00 0D 我知道这不是最好的解决方案,但最接近我所需要的。 现在它也存储在tmp中,因此也可以在以后使用,而不仅仅是打印一次。这就是为什么需要。
EDITED
一些更好的版本:
uint8_t telegram;
char *tmp = (char*)malloc(sizeof(telegram));
int test = 0;
for (int i = 0; i < sizeof(telegram); i++)
{
test += sprintf (tmp + test, " %02X", telegram[i]);
}
printf ("Uint8_t: %s",tmp);
答案 0 :(得分:3)
只需使用snprintf()
,它就是用于生成字符串的库标准函数,非常类似于printf()
,除了打印而不是打印生成的字符串,它只是在内存中创建。
答案 1 :(得分:2)
您的原始问题不包含语言标记,因此不清楚您是使用C或C ++编程。这两种语言是不同的语言,每种语言的最佳答案都不同。
虽然C ++与C共享一个共同的祖先,而sprintf
确实是C ++标准库的一部分,但如果您使用C ++进行编程,则可能不应该使用sprintf
或它的相关函数。这一系列功能显然是不安全的。
在C ++中有许多类型安全的方法可以做到这一点,但是一个好的起点是使用C ++流及其操纵器:
std::stringstream ss;
ss << std::hex << telegramData[i];
std::string s = ss.str();
Boost库中还有类型安全的替代方案,它们与sprintf
具有相似的语法。
答案 2 :(得分:0)
代表C
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define uint_join(p, a, ch) do{\
size_t type_size = sizeof(*a), size = sizeof(a)/type_size;\
size_t i, len = 0;\
p = malloc(size * (type_size * 2 + 1));\
if(p)\
for(i=0;i<size;++i){\
switch(type_size){\
case 1:\
len += sprintf(p+len, (i < size -1 ? "%0*" PRIX8 "%c" : "%0*" PRIX8), type_size*2, a[i], ch);\
break;\
case 2:\
len += sprintf(p+len, (i < size -1 ? "%0*" PRIX16 "%c" : "%0*" PRIX16), type_size*2, a[i], ch);\
break;\
case 4:\
len += sprintf(p+len, (i < size -1 ? "%0*" PRIX32 "%c" : "%0*" PRIX32), type_size*2, a[i], ch);\
break;\
case 8:\
len += sprintf(p+len, (i < size -1 ? "%0*" PRIX64 "%c" : "%0*" PRIX64), type_size*2, a[i], ch);\
break;\
}\
}\
}while(0)
int main (void){
uint8_t telegramData[] = { 0xC8, 0x4A, 0x00, 0x0D};
char *tmp;
uint_join(tmp, telegramData, ' ');
printf ("Uint8_t: %s\n", tmp);
free(tmp);
return 0;
}