将unsigned int(uint8,16,32)存储在变量中

时间:2014-01-08 14:21:16

标签: c++ uint8t

我想在字符串中存储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);

3 个答案:

答案 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;
}