Member 13475664 Ответов: 2

Считывание и хранение массива шестнадцатеричных данных


Я буду читать 8 шестнадцатеричных данных в массив и мне нужно сохранить их в данные в классе
может ли кто-нибудь сказать мне, как я могу читать и хранить его?

данные представлены следующим образом
0.002893 1 201 Rx d 8 06 0D 00 B0 89 00 0D E7

моя функция такова

пустота CANReader::readData(с std::iStream модели& находится, CANReader&амп; сведения)
{
СТД::строка;
std::getline(is, line);
std::istringstream iss(линия);

МКС >> данные.Время;
МКС &ГТ;&ГТ; сведения.Государство;
МКС &ГТ;&ГТ; сведения.Идентификатор;
МКС &ГТ;&ГТ; сведения.Tx_Rx_State;
МКС >> данные.Тип;
МКС >> данные.Byte_info;
МКС &ГТ;&ГТ; сведения.сообщение;


}

Что я уже пробовал:

я не могу получить точный метод

2 Ответов

Рейтинг:
2

Member 13475664

большое вам спасибо за руководство и помощь


Patrice T

Используйте кнопку "есть вопрос или комментарий?" поговорить с автором решения.
Преимущество: автор получает уведомление.

Рейтинг:
13

CPallini

если вы хотите сохранить числа (например, в массив байтов), представленные шестнадцатеричными строками, то попробуйте:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdint>
#include <array>
#include <exception>
using namespace std;


uint8_t hex(const string & str)
{
  uint8_t b = 0;
  for (size_t n=0; n<2; ++n)
  {
    b <<= 4;
    char c = str.at(n);
    if ( c >= '0' && c <= '9')
      b |= static_cast<uint8_t>(c-'0');
    else if ( c >= 'A' && c <= 'F')
      b |= static_cast<uint8_t>(c-'A'+0xA);
    else if ( c >= 'a' && c <= 'f')
      b |= static_cast<uint8_t>(c-'a'+0xA);
    else
      throw(invalid_argument("not an hex string"));
  }
  return b;
}

int main()
{
  string line = "06 0D 00 B0 89 00 0D E7";

  istringstream iss(line);

  array<uint8_t, 8> data;

  for (auto & d : data)
  {
    string s;
    iss >> s;
    d = hex(s);
  }

  for (const auto & d : data)
    cout << static_cast<unsigned int>(d) << endl;
}


[обновление]
Следуя предложению Йохена, нет никакой необходимости в преобразовании Гекса манулы:
#include <iostream>
#include <sstream>
#include <cstdint>
#include <array>
#include <exception>
using namespace std;

int main()
{
  string line = "06 0D 00 B0 89 00 0D E7";

  istringstream iss(line);

  array<uint8_t, 8> data;

  for (auto & d : data)
  {
    size_t pos = 0;
    string s;
    iss >> s;
    d = static_cast<uint8_t>( stoul(s, &pos, 16));
    if ( pos != 2)
       throw(invalid_argument("not a byte hexadecimal representation"));
  }

  for (const auto & d : data)
    cout << static_cast<unsigned int>(d) << endl;
}


[/обновление]


Jochen Arndt

Использование std::stoul() (или std::strtoul для pre C++11) позволяет избежать выполнения преобразования "вручную". Недопустимый ввод может быть обнаружен с помощью параметра pos, и возвращаемое значение может быть приведено к uint8_t после проверки переполнения.

CPallini

Да, спасибо, что указали на это.

Richard MacCutchan

Хороший код; кое-что еще я узнал о C++.

CPallini

Современные возможности языка C++ действительно хороши.

Richard MacCutchan

Будучи динозавром, я нахожу их скорее полезными, чем приятными. :)