Название: 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); } }
|