BlinCT
12 декабря 2018 г. 16:00

Конвертация из std::string в другой тип

с++

Всем привет.
Может кто подсказать, как правильно сконвертировать "std::string" в тип "uint8_t data[16]" и как обратно?
То есть что-то типа

  1. struct uid
  2. {
  3. uint8_t data[16];
  4.  
  5. std::string Serialize() const;
  6. uid Deserialize(const std::string& str);
  7. };

Вроде как это надо или можно сделать через memcpy() но у меня чет не получается(
Буду очень признателен.

2

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 12 декабря 2018 г. 16:41
  • (ред.)

Привет.

memcpy() - это из мира Си. Не думаю, что его будет уместно использовать в c++ без веской неоходимости

Любой массив можно преобразовать в std::string через цикл.

  1. uint8_t data[16]
  2.  
  3. std::ostringstream os;
  4. for (uint8_t i : data)
  5. {
  6. os << i;
  7. }

ну или так, если первый вариант не заработает

  1. uint8_t data[16]
  2.  
  3. std::ostringstream os;
  4. for (int i = 0; i < 16; ++i)
  5. {
  6. os << data[i];
  7. }

Думаю, что обратный вариант также возможен подобным образом

  1. int i = 0;
  2. for(char& c : str) {
  3. arr[i] = static_cast<uint8_t>(c);
  4. ++i;
  5. }

Не помню, как поведёт себя static_cast в последнем случае, возможно нужен будет reinterpret_cast.

    BlinCT
    • 12 декабря 2018 г. 16:50

    А разве такой вариант коректен при условии что размер data[16]?

      Evgenii Legotckoi
      • 12 декабря 2018 г. 16:56
      • (ред.)
      • Ответ был помечен как решение.

      с чего он бы не был корректен?

      uint8_t - это однобайтовый тип данных, также как и char. В Си обычным кастом в embedded разработке гоняют из char в unit8_t данные постоянно.

      А то, что это размер 16, ну сделай дополнительную проверку на размер и делай break в цикле.

      1. int i = 0;
      2. for(char& c : str)
      3. {
      4. if (i < 16)
      5. {
      6. arr[i] = static_cast<uint8_t>(c);
      7. ++i;
      8. }
      9. else
      10. {
      11. break;
      12. }
      13. }
        BlinCT
        • 13 декабря 2018 г. 15:08

        Спасибо, тема закрыта.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь