Russian Qt Forum
Май 10, 2024, 07:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Signed char  (Прочитано 3671 раз)
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);
   }
}
Записан
spirit
Гость
« Ответ #1 : Октябрь 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.
Записан
QtProger
Гость
« Ответ #2 : Октябрь 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);
   }
}
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Октябрь 19, 2009, 13:30 »

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

Код
Diff
-             str+=(QString::number(b, 16)+" ");
+             str+=QString("%1 ").arg((uchar)b, 2, 16, QChar('0'));
 
« Последнее редактирование: Октябрь 19, 2009, 13:34 от Alex Custov » Записан
QtProger
Гость
« Ответ #4 : Октябрь 19, 2009, 16:24 »

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

Спасибо ! Работает. А что означает 4-ый параметр метода arg ? QChar('0') ?
Записан
crackedmind
Гость
« Ответ #5 : Октябрь 19, 2009, 16:33 »

Какими символами, будет дополнятся строка, если получится что ширина меньше 2 символов

> 1 => "01"
Записан
QtProger
Гость
« Ответ #6 : Октябрь 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);
   }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 23.