приведение элементов вектора uint8 к stringstream

У меня возникли проблемы с выяснением того, как преобразовать мой вектор uint8 в stringstream.

На входе я получаю вектор uint8, первые 9 байтов - это флаги, которые мне не нужны в моем строковом потоке, следующие 2 байта - это некоторые данные, которые мне нужны в виде строки, давайте назовем их "name1", следующие 2 байта - это другое имя, чтобы не называть его "имя2", затем идут 4 байта, которые представляют собой некоторое число uint32 (но записываются как 4 байта uint8), давайте назовем его просто "число". Теперь мне нужно передать эти данные в stringstream, но:

  • name1 и number2 должны быть записаны как байты (byte 0x52 -> char[2]={"5","2"})
  • число должно быть приведено к uint32
  • все переменные должны быть разделены точкой с запятой в конечном потоке строк

поэтому, если я получаю такой вектор:

--- около 9 байт ---, 0x05, 0x00, 0x01,0x00,0x00,0x00,0x08,0x0E, --- некоторые другие данные---

мне нужно, чтобы stringstream был таким:

"0500;0100;2062;"

мне удалось выяснить, как привести номер к uint32:

uint8_t tab[4];
for(int i=4; i!=0; --i)
{
    tab[4-i]=data[i+14];
}
uint32_t* var = (uint32_t*)tab;

есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ:

Как передать значения uint8 в строку в виде символов?

пример:

байтовый вывод: 0x05

строковый вывод: 05

могу ли я поместить строку в stringstream с помощью оператора «‹‹» или это не рекомендуется?


person Cynizm    schedule 28.08.2015    source источник


Ответы (2)


если у вас есть строка, просто зациклите строку и выведите символы в свой поток строк

std::string name = "name1";
std::stringstream ss;
for(auto c : name)
  ss << std::static_cast<int>(c);
ss << ";";

В качестве примечания:

uint32_t* var = (uint32_t*)tab;

совершенно бесполезен, вам не нужен указатель.

person dau_sama    schedule 28.08.2015
comment
хорошо, я понимаю, что вы имеете в виду, но мне нужно заполнить строку символами uint8 из вектора данных, как я могу заполнить строку этими символами, чтобы 0x05 и 0x00 в векторе данных выглядели в строке следующим образом: 0500 мне нужны только эти два байта. тогда мне нужно бросить его - person Cynizm; 28.08.2015
comment
ваш вопрос не совсем ясен. Пожалуйста, уточните и не пишите на смс-подобном английском языке. Если вам нужно заполнить строку, вы всегда можете append ввести символы в нужную строку. - person dau_sama; 28.08.2015
comment
Добавлено редактирование с разъяснением, надеюсь, это прояснит мою проблему. - person Cynizm; 28.08.2015

Я не уверен, что это решит вашу проблему, но я бы выбрал другой подход.

я бы использовал структуру для описания базового протокола, а затем продолжил бы это. пример:

struct dx{
  uint8 _junk0[9];
  char  name1[2];
  char  name2[2];
  uint32 num;
} __attribute__((packed));

uint8 *input;
dx* struct=(dx*)input;
printf("%d",dx->num);
person Zoltán Haindrich    schedule 28.08.2015
comment
это так C, C++ способ состоял бы в том, чтобы переопределить оператор << Также не используя printf, но cout - person dau_sama; 28.08.2015
comment
Гораздо большая проблема заключается в том, что это нарушает строгое сглаживание. - person Voo; 28.08.2015
comment
@Voo: спасибо, что заметили это, я читал об этом - и да, это так;) - person Zoltán Haindrich; 19.10.2015