Russian Qt Forum

Qt => Общие вопросы => Тема начата: QtProger от Октябрь 19, 2009, 12:42



Название: Signed char
Отправлено: QtProger от Октябрь 19, 2009, 12:42
Добрый день. Делаю hex-редактор. Сделал функцию, которая преобразует двоичное число char в шестнадцатеричное, и записывает в QString. Запустил. Какие-то байты правильно показывает, а какие-то неправильно. Сделал дебаг. Оказалось, что некоторые байты записываются в char с отрицательным знаком ??? . Что с этим делать ?

Вот функция, переводящая полученный байт в Hex.

Код
C++ (Qt)
QString byteToHex(char b)
{
   QString str;
   switch(b/16)
   {
       case 0: str="0"; break;
       case 1: str="1"; break;
       case 2: str="2"; break;
       case 3: str="3"; break;
       case 4: str="4"; break;
       case 5: str="5"; break;
       case 6: str="6"; break;
       case 7: str="7"; break;
       case 8: str="8"; break;
       case 9: str="9"; break;
       case 10: str="A"; break;
       case 11: str="B"; break;
       case 12: str="C"; break;
       case 13: str="D"; break;
       case 14: str="E"; break;
       case 15: str="F"; break;
   }
   switch(b%16)
   {
       case 0: str+="0"; break;
       case 1: str+="1"; break;
       case 2: str+="2"; break;
       case 3: str+="3"; break;
       case 4: str+="4"; break;
       case 5: str+="5"; break;
       case 6: str+="6"; break;
       case 7: str+="7"; break;
       case 8: str+="8"; break;
       case 9: str+="9"; break;
       case 10: str+="A"; break;
       case 11: str+="B"; break;
       case 12: str+="C"; break;
       case 13: str+="D"; break;
       case 14: str+="E"; break;
       case 15: str+="F"; break;
   }
   str+=" ";
   return str;
}

Вот функция открывающая файл.

Код
C++ (Qt)
void MyWidget::MyOpenClick()
{
   fileName = QFileDialog::getOpenFileName(this, tr("Open file"), "C:\\", tr("Any files (*)"));
   if(fileName!="")
   {
       QFile file(fileName);
       file.open(QIODevice::ReadOnly);
       QDataStream text(&file);
       char b;
       QString str;
       while(text.readRawData(&b, 1))
           str+=byteToHex(b);
       ui->plainTextEdit->setPlainText(str);
   }
}


Название: Re: Signed char
Отправлено: spirit от Октябрь 19, 2009, 12:51
а почему бы не использовать QString::number?
Цитировать
Returns a string equivalent of the number n according to the specified base.
The base is 10 by default and must be between 2 and 36. For bases other than 10, n is treated as an unsigned integer.


Название: Re: Signed char
Отправлено: QtProger от Октябрь 19, 2009, 13:12
а почему бы не использовать QString::number?

Сделал так, но все равно работает криво

Код
C++ (Qt)
void MyWidget::MyOpenClick()
{
   fileName = QFileDialog::getOpenFileName(this, tr("Open file"), "C:\\", tr("Any files (*)"));
   if(fileName!="")
   {
       QFile file(fileName);
       file.open(QIODevice::ReadOnly);
       QDataStream text(&file);
       char b;
       QString str;
       while(text.readRawData(&b, 1))
           str+=(QString::number(b, 16)+" ");
       ui->plainTextEdit->setPlainText(str);
   }
}


Название: Re: Signed char
Отправлено: Alex Custov от Октябрь 19, 2009, 13:30
Сделал так, но все равно работает криво

Код
Diff
-             str+=(QString::number(b, 16)+" ");
+             str+=QString("%1 ").arg((uchar)b, 2, 16, QChar('0'));
 


Название: Re: Signed char
Отправлено: QtProger от Октябрь 19, 2009, 16:24
Код
Diff
-             str+=(QString::number(b, 16)+" ");
+             str+=QString("%1 ").arg((uchar)b, 2, 16, QChar('0'));
 

Спасибо ! Работает. А что означает 4-ый параметр метода arg ? QChar('0') ?


Название: Re: Signed char
Отправлено: crackedmind от Октябрь 19, 2009, 16:33
Какими символами, будет дополнятся строка, если получится что ширина меньше 2 символов

> 1 => "01"


Название: Re: Signed char
Отправлено: QtProger от Октябрь 19, 2009, 16:38
Спасибо за помощь ! Кстати, такой код тоже работает

Код
C++ (Qt)
QString byteToHex(uchar b)
{
   QString str;
   switch(b/16)
   {
       case 0: str="0"; break;
       case 1: str="1"; break;
       case 2: str="2"; break;
       case 3: str="3"; break;
       case 4: str="4"; break;
       case 5: str="5"; break;
       case 6: str="6"; break;
       case 7: str="7"; break;
       case 8: str="8"; break;
       case 9: str="9"; break;
       case 10: str="A"; break;
       case 11: str="B"; break;
       case 12: str="C"; break;
       case 13: str="D"; break;
       case 14: str="E"; break;
       case 15: str="F"; break;
   }
   switch(b%16)
   {
       case 0: str+="0 "; break;
       case 1: str+="1 "; break;
       case 2: str+="2 "; break;
       case 3: str+="3 "; break;
       case 4: str+="4 "; break;
       case 5: str+="5 "; break;
       case 6: str+="6 "; break;
       case 7: str+="7 "; break;
       case 8: str+="8 "; break;
       case 9: str+="9 "; break;
       case 10: str+="A "; break;
       case 11: str+="B "; break;
       case 12: str+="C "; break;
       case 13: str+="D "; break;
       case 14: str+="E "; break;
       case 15: str+="F "; break;
   }
   return str;
}
 
void MyWidget::MyOpenClick()
{
   fileName = QFileDialog::getOpenFileName(this, tr("Open file"), "C:\\", tr("Any files (*)"));
   if(fileName!="")
   {
       QFile file(fileName);
       file.open(QIODevice::ReadOnly);
       QDataStream text(&file);
       char b;
       QString str;
       while(text.readRawData(&b, 1))
           str+=QString(byteToHex((uchar)b));
       ui->plainTextEdit->setPlainText(str);
   }
}