Я хотел бы сохранить 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 ++.
Телеграмма не так важна (да, она имеет правильный размер, просто не заметила раньше — «основной код»).
Наконец-то использовал 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);
Просто используйте snprintf()
, это стандартная функция библиотеки для создания строк, очень похоже на printf()
за исключением того, что вместо печати также печатается полученная строка, она просто создается в памяти.
Ваш первоначальный вопрос не включал языковой тег, поэтому неясно, программируете ли вы на 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
,
для 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;
}