0

我想将 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" 有什么方法吗?真的提前谢谢!

已编辑

你好,好像我发现了。我正在使用 C++,对不起,我认为标记错误。我正在使用 g++ 编译器。Telegram 没有那么重要(是的,它有适当的大小,只是在此之前没有注意-“核心代码”)。最后使用了 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 中,所以以后也可以使用,而不仅仅是打印一次。这就是为什么需要。

已编辑

一些更好的版本:

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);
4

3 回答 3

3

只需使用snprintf(),它是一个用于生成字符串的库标准函数,非常类似于printf()除了打印而不是打印结果字符串之外,它只是在内存中创建的。

于 2014-01-08T14:25:32.613 回答
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.

于 2014-01-08T15:00:23.380 回答
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;
}
于 2014-01-08T15:59:27.693 回答