C++ 在变量中存储无符号整数(uint8,16,32)

C++ 在变量中存储无符号整数(uint8,16,32),c++,uint8t,C++,Uint8t,我想存储格式为字符串的uint8_t(也可以更改为uint_16或32)。我需要将它们格式化为十六进制,并希望将它们与格式一起存储。 我有这样的东西(只是核心): uint8_t电报数据[]; 对于(int i=0;i你原来的问题没有包含语言标记,所以不清楚你是用C还是C++编程。这两种语言是不同的,每种语言的最佳答案都会有所不同 虽然C++与C共享一个共同的祖先,而代码> SpRIFT确实是C++标准库的一部分,如果你在C++中编程,你可能不应该使用 SpReFTF < /COD>或它的相关函

我想存储格式为字符串的uint8_t(也可以更改为uint_16或32)。我需要将它们格式化为十六进制,并希望将它们与格式一起存储。 我有这样的东西(只是核心):

uint8_t电报数据[];
对于(int i=0;i
输出示例:Uint8\u t:C8 4A 00 0D

而不是打印出来应该存储,但格式正确。 最好是我有一个结果作为例子:string str=“C8 4A 00 0D” 有什么办法吗?真的提前谢谢了

已编辑

您好, 好像我发现了。 我使用C++,抱歉我认为标签出错了。我用的是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电报;
char*tmp=(char*)malloc(sizeof(电报));
对于(int i=0;i
输出结果:Uint8\u 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);
uint8\t电报;
char*tmp=(char*)malloc(sizeof(电报));
int检验=0;
对于(int i=0;i
只需使用,它是一个用于生成字符串的库标准函数,非常类似于
printf()
,除了不打印也打印生成的字符串之外,它只是在内存中创建的。

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

您原来的问题没有包含语言标记,所以不清楚您是用C还是C++编程。这两种语言是不同的,每种语言的最佳答案都会有所不同

<>虽然C++与C共享一个共同的祖先,而<>代码> SpRIFT确实是C++标准库的一部分,如果你在C++中编程,你可能不应该使用<代码> SpReFTF < /COD>或它的相关函数。这个函数族肯定是类型不安全的

<>在C++中有很多类型安全的方法,但是一个好的开始是使用C++流和它们的操作器:

std::stringstream ss;
ss << std::hex << telegramData[i];
std::string s = ss.str();
std::stringstream-ss;

SS< P>你原来的问题没有包含语言标记,所以不清楚你是用C还是C++编程。这两种语言是不同的,每种语言的最佳答案都会有所不同

<>虽然C++与C共享一个共同的祖先,而<>代码> SpRIFT确实是C++标准库的一部分,如果你在C++中编程,你可能不应该使用<代码> SpReFTF < /COD>或它的相关函数。这个函数族肯定是类型不安全的

<>在C++中有很多类型安全的方法,但是一个好的开始是使用C++流和它们的操作器:

std::stringstream ss;
ss << std::hex << telegramData[i];
std::string s = ss.str();
std::stringstream-ss;
C组ss

#包括
#包括
#包括
#定义uint_join(p,a,ch)do{\
尺寸=类型尺寸=尺寸(*a),尺寸=尺寸(a)/类型尺寸\
尺寸i,len=0\
p=malloc(尺寸*(类型_尺寸*2+1))\
如果(p)\
对于(i=0;对于C,i

#包括
#包括
#包括
#定义uint_join(p,a,ch)do{\
尺寸=类型尺寸=尺寸(*a),尺寸=尺寸(a)/类型尺寸\
尺寸i,len=0\
p=malloc(尺寸*(类型_尺寸*2+1))\
如果(p)\

对于(i=0;i@H2CO3“因为这不是你喜欢的风格,并不意味着SophieH不使用C++编译器。@ H2CO3,在我编辑的时候,我不知道,希望OP会回来,他们正在使用的,我可以删除一个。而你是正确的-不幸的是,我知道很多人使用C++和使用代码> Prtff < /代码>其他非STL功能。@ SophieH H2CO3:使用的是代码> Prtff
,不是<代码> SNPROTFF < /Code >。<代码> Prtff<代码>是在C++标准库中。完全可以用C++编写代码,使用C++编译器,不使用任何错误编译代码。只有索菲知道他们使用的编译器。你回来说他们使用C++,一个好的答案会建议他们不要使用<代码> SpaFrf。但是这并不意味着问题不是C++问题。@ H2CO3:论点无关。为什么你会假设在这个例子中,以前未知的海报不做C++中的一些东西,通常被认为是错误的?我知道你不喜欢阿尔瓦。Sophih:请不要使用cplusplus.com作为参考,它充满了不准确和不好的建议。最好是cppusplus.com。com@H2CO3字体只是因为这不是你喜欢的风格,并不意味着SophieH不使用C++编译器。@ H2CO3,在我编辑的时候,我不知道,希望OP会回来,他们正在使用的,我可以删除一个。而你是正确的-不幸的是,我知道很多人使用C++和使用<代码> Prtff<代码>和其他非STL功能。@ SophieH H2CO3:使用的是<代码> Prtff
,不是<代码> SNPROTFF < /Code >。<代码> Prtff<代码>是在C++标准库中的。完全可以用<代码> Primtf<代码>编写有效的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;
}