0

uint8_t (uint_16 または 32 にも変更される可能性があります) を文字列にフォーマットして保存したいと思います。それらを16進数としてフォーマットする必要があり、フォーマットとともに保存したいと考えています。私はこのようなものを持っています(コアのみ):

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++ コンパイラを使用しています。電報はそれほど重要ではありません(はい、適切なサイズです。ここで注意しなかっただけです-「コアコード」)。最後に 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 に答える
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 に答える