Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Декабрь 10, 2013, 17:29



Название: QTextEdit
Отправлено: demaker от Декабрь 10, 2013, 17:29
Вывожу данные через QTextEdit
Код
C++ (Qt)
void MainWindow::getShowData(QByteArray data)
{
txtTraffic->append(data.toHex);
}
 

Подскажите как сделать пробелы между байтами в посылке при выводе???


Название: Re: QTextEdit
Отправлено: Bepec от Декабрь 10, 2013, 17:35
Хочешь извращённый костыль? Каждый байт переводить в HEX строку и добавлять к ней нолик если символов не хватает :)


Название: Re: QTextEdit
Отправлено: demaker от Декабрь 10, 2013, 17:38
Глум :D


Название: Re: QTextEdit
Отправлено: Bepec от Декабрь 10, 2013, 17:52
Увы, нет. У меня так делается. Иного способа я не нашёл, разве что мап сделать и через него гонять байты :D

PS а для логирования лучше использовать бинарные данные. А строки обычно нужны при отладке и их довольно мало.



Название: Re: QTextEdit
Отправлено: demaker от Декабрь 10, 2013, 18:35
Код
C++ (Qt)
QString MainWindow::dumpFunc(QByteArray ba)
{
   QString strStr;
   QString strHex;
   char strBufStr[4];
   char strBufHex[5];
 
   for(int i = 0; i<ba.length(); i++)
   {
       if(i%8 == 15)
       {
           ::sprintf(strBufHex,"%02X\n",(unsigned char)(ba.at(i)));
 
           if((ba.at(i) != 0 )&& ((unsigned char)(ba.at(i)) < 128))
           {
               ::sprintf(strBufStr,"%c\n",(unsigned char)(ba.at(i)));
           }
           else
           {
               strBufStr[0] = '.';
               strBufStr[1] = '\n';
               strBufStr[2] = 0;
           }
       }
       else if(i%8 == 7)
       {
           ::sprintf(strBufHex,"%02X  ",(unsigned char)(ba.at(i)));
 
           if((ba.at(i) != 0 )&& ((unsigned char)(ba.at(i)) < 128))
           {
               ::sprintf(strBufStr,"%c  ",(unsigned char)(ba.at(i)));
           }
           else
           {
               strBufStr[0] = '.';
               strBufStr[1] = ' ';
               strBufStr[2] = ' ';
               strBufStr[3] = 0;
           }
       }
       else
       {
           ::sprintf(strBufHex,"%02X ",(unsigned char)(ba.at(i)));
 
           if((ba.at(i) != 0 )&& ((unsigned char)(ba.at(i)) < 128))
           {
               ::sprintf(strBufStr,"%c ",(unsigned char)(ba.at(i)));
           }
           else
           {
               strBufStr[0] = '.';
               strBufStr[1] = ' ';
               strBufStr[2] = 0;
           }
       }
 
       strHex.append(strBufHex);
       strStr.append(strBufStr);
   }
   strHex.append(" | ");
   strHex.append(strStr);
   return strHex;
}
 

сделал вот так, шарит :)


Название: Re: QTextEdit
Отправлено: Bepec от Декабрь 10, 2013, 19:20
Фигасе простыня... А у меня простой цикл с несколькими строчками. Я так не могу :(


Название: Re: QTextEdit
Отправлено: Old от Декабрь 10, 2013, 19:30
Код
C++ (Qt)
   if(i%8 == 15)
и что в эту ветку заходит?


Название: Re: QTextEdit
Отправлено: demaker от Декабрь 11, 2013, 10:17
Код
C++ (Qt)
   if(i%8 == 15)
и что в эту ветку заходит?
Это остаток от деления на 8


Название: Re: QTextEdit
Отправлено: demaker от Декабрь 11, 2013, 10:19
Фигасе простыня... А у меня простой цикл с несколькими строчками. Я так не могу :(

А заценить можно?


Название: Re: QTextEdit
Отправлено: Majestio от Декабрь 11, 2013, 10:29
Это остаток от деления на 8

Остаток от деления на 8 == 15.
Это не в нашем измерении.


Название: Re: QTextEdit
Отправлено: demaker от Декабрь 11, 2013, 11:11
Это остаток от деления на 8

Остаток от деления на 8 == 15.
Это не в нашем измерении.

М-да это лишнее, согласен! :)


Название: Re: QTextEdit
Отправлено: Bepec от Декабрь 11, 2013, 14:18
Код:
	
        if (tmpArray.size() > 0)
{
QString tmpStr2(tmpArray.toHex());
for (int i = 0; i < tmpStr2.size(); i+=3)
{
tmpStr2.insert(i, " ");
}
ui.plainTextEdit->appendPlainText(tmpStr2.toUpper());
}

Эм.. ну и всё :)


Название: Re: QTextEdit
Отправлено: Majestio от Декабрь 11, 2013, 16:28
Ну и я свои пять копеек вставлю ... считаю что инсертить по символу в QString - это не халяльно :)
Вот мой вариантик, если в виде функции:

Код
C++ (Qt)
QString dumpFunc(QByteArray Ba)
{
   QString Res("");
   char *T = "0123456789ABCDEF";
   if (int L = Ba.size()) {
       char *W = new char[L*3-1];
       memset(W,32,(L-1)*3); W[L*3-1] = 0;
       for(int i=0,p=0; i<L; i++,p++) {
           *(W+p++) = T[Ba[i] >> 0x4];
           *(W+p++) = T[Ba[i]  & 0xF];
       }
       Res.append(W);
       delete W;
   }
   return Res;
}
 

Хоть и строк чуть-чуть больше, но она будет пошустрее на больших дампах. ИМХО.


Название: Re: QTextEdit
Отправлено: Bepec от Декабрь 11, 2013, 16:33
Не спорю :) Но как быстрое решение она подошла почти идеально :)

PS кстати интересный вопрос, мапа с соответствием символов будет быстрее вашей ф-ции или нет? Подозреваю что нет, но всё равно спрошу :)


Название: Re: QTextEdit
Отправлено: Majestio от Декабрь 11, 2013, 16:42
PS кстати интересный вопрос, мапа с соответствием символов будет быстрее вашей ф-ции или нет? Подозреваю что нет, но всё равно спрошу :)

Если все 256 значений вбить, от 00 .. FF? Думаю это ускорит, но крайне незначительно. Основная байда с тормозами, имхо, не в количестве вычислений - а именно с манипуляциями с памятью. Это нужно минимизировать.