LINUX.ORG.RU

qt конвектирование ASCII hex to int

 ,


0

1

Привет. Вот не знаю как лучше сделать это в qt4,7,8. Имею вот такие данные:

:102000003009002001280000F9270000F92700000E
:1020100000000000000000000000000000000000C0
:10202000000000000000000000000000F927000090

Нужно разложить их на int. Должно получится 10,2000,00,30,09 и т.д.

Как правильно эта сделать ?

10,2000,00,30,09

10,2000,00,30,09?

Закономерность не распарсил.

anonymous
()

Нужно разложить их на int

Имеешь ввиду uint8?

crutch_master ★★★★★
()

Ну читай побайтово в цикле и набивай текущее число пока нули идут, а как идет не ноль то начинаешь новое число.

rumgot ★★★★★
()
if ( str.length() % 2 != 0 )
	str.insert(0, "0");
int sz = str.length / 2;
int *arr = new int[sz];
for ( int i = 0, j = 0; i < str.length(); i += 2 ){
	char buf[3]{0};
	buf[1] = str[i];
	buf[2] = str[i+1];
	arr[j++] = std::stoi(buf, nullptr, 16);
}
SR_team ★★★★★
()

разве в Qt нет регехпа? хотя давайте, завалите автора тоннами сишного кода...

#include <iostream>
#include <regex>

int main()
{

  std::string str = "10202000000000000000000000000000F927000090";
  std::regex reg("\\w{2}");
  std::smatch mth;

  while(std::regex_search(str, mth, reg))
  {
    str = mth.suffix().str();
    std::cout << "0x" << mth.str() << std::endl;
  }

 return 0;
}

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)
Ответ на: комментарий от SR_team

arr[j++] = std::stoi(buf, nullptr, 16);

По моему, тут другая проблема - неявное преобразование buf в std::string вызовет strlen( buf )! А buf[0] = 0 и buf ничем не ограничен (buf[3] = мусор)

sigurd ★★★★★
()
Ответ на: комментарий от anonymous2

Вариант с регексом нифига не работает! И насчет тонн сишного кода - вариант c регексом весит 555 кБ и не работает, вариант с std::stoi весит 15 кБ и работает правильно!

#include <iostream>

using namespace std;

int main()
{
	string str = "10202000000000000000000000000000F927000090";

	if( str.length() % 2 != 0 ) str.insert( 0, "0" );

	cout << str << endl;

	int sz = str.length() / 2;
	int *arr = new int[sz];

	for( int i = 0, j = 0; i < str.length(); i += 2, j++ ) {
		char buf[3] = { 0 };
		buf[0] = str[i];
		buf[1] = str[i+1];
		arr[j] = stoi( buf, nullptr, 16 );
		
		cout << arr[j] << endl;
	}

	return 0;
}

sigurd ★★★★★
()
Ответ на: комментарий от anonymous

Двоеточие в начале строки просрал. (Негоже менять условия ТС).

Я взял готовый пример с регексом, чтобы посмотреть как оно работает! Там тоже нет ':', но заменить на пробел не проблема:


if( str[0] == ':' ) str[0] = ' ';

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от sigurd

во же:

char buf[3]{0};

изначально буфер заполнен нулями, а потом в buf[0] пишется значение из строки и не 0, а ‘0’, т.е. 48

SR_team ★★★★★
()
Ответ на: комментарий от anonymous

Ну можно и так, если есть уверенность, что всегда первый символ пропускаем.

sigurd ★★★★★
()
Ответ на: комментарий от SR_team

Посмотри свой код -

char buf[3]{0}; 
buf[1] = str[i];
buf[2] = str[i+1];
в buf[0] ничего не записали! Длина строки = 0 и stoi() ругается на аргументы!

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от sigurd

регексп работает, строчки поменять над, просто я необязан писать идеальный рабочий код за бесплатно)))

    std::cout << "0x" << mth.str() << std::endl;
    str = mth.suffix().str();

а то что вы пишите это сишка все равно как бы вы ее не заворачивали, в вашем лучшем случае проще заюзать istringstream ползать по нему

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)
Ответ на: комментарий от anonymous2

я необязан писать идеальный рабочий код за бесплатно

Ключевое слово «рабочий», а с нерабочим и ты здесь задаром не нужен. :)

anonymous
()
Ответ на: комментарий от anonymous2

чем не угодил вариант с istringstream?

#include <iostream>
#include <sstream>
#include <string>

int main()
{

  std::string str = "10202000000000000000000000000000F927000090";
  std::istringstream is(str);
  std::string hex;
  is.width(2);

  while(is >> hex)
  {
      std::cout << "0x" << hex << std::endl;
      is.width(2);
  }
  return 0;
}

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

чем не угодил вариант с istringstream?

Отсутствием двоеточия в начале строки. (Менять условия ТС нехорошо)

anonymous
()
Ответ на: комментарий от anonymous2

останется на хлеб для ТС

Ну, соответственно, и отношение соответствующее. (Менять условия ТС нехорошо)

anonymous
()
Ответ на: комментарий от anonymous

а я по жизни нехороший сисадмин, когда я родился главбухгалтер заплакал, дальше что?

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)
Ответ на: комментарий от SR_team

Я подумал вот а таком коде

        QString str = ":102000003009002001128000F9";
      //QString str = ":102000003009002001280000F9270000F92700000E";
    str.remove(":");

        QRegExp pattern("(\\d{2})(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})");
        if(pattern.exactMatch(str))
        {
            QStringList match = pattern.capturedTexts();
            match.removeAt(0);
            for(QStringList::iterator i = match.begin(); i != match.end(); i++)
                        qDebug() << (*i) + " - " + QString::number((*i).toInt());
        }
        else
        {
            qDebug() << "Wrong string";
        }
Но споткнулся на числе «F9». Программа выдает «Wrong string». Как можно сделать считывание hex чисел ?

Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Тут все решается элементарно без всяких регекспов. Тупо на стрингстриме или на индексах. Ппц, дожили.

kuzulis ★★
()

Как правильно эта сделать ?

правильна взять готовый парсер формата intel hex.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.