Russian Qt Forum

Qt => Общие вопросы => Тема начата: ieroglif от Июль 31, 2009, 11:55



Название: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: ieroglif от Июль 31, 2009, 11:55
пишу такой код
Код:
	QFile f(fileName);
f.open(QIODevice::ReadOnly);
fileData = f.readAll();
f.close();
bool ok;
qDebug() << fileData.mid(0,2).toShort(&ok,16) << " " << ok;

на выходе получаю "0 false" в то время как два символа там находящиеся - это "MM".
как их конвертнуть что бы получить сравнение с 0x4D4D ?


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: spectre71 от Июль 31, 2009, 12:42
пишу такой код
Код:
	QFile f(fileName);
f.open(QIODevice::ReadOnly);
fileData = f.readAll();
f.close();
bool ok;
qDebug() << fileData.mid(0,2).toShort(&ok,16) << " " << ok;

на выходе получаю "0 false" в то время как два символа там находящиеся - это "MM".
как их конвертнуть что бы получить сравнение с 0x4D4D ?
:D
"MM" - не является 16-чным представлением числа в строке! Естественно будет FALSE


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: ieroglif от Июль 31, 2009, 12:54
пишу такой код
Код:
	QFile f(fileName);
f.open(QIODevice::ReadOnly);
fileData = f.readAll();
f.close();
bool ok;
qDebug() << fileData.mid(0,2).toShort(&ok,16) << " " << ok;

на выходе получаю "0 false" в то время как два символа там находящиеся - это "MM".
как их конвертнуть что бы получить сравнение с 0x4D4D ?
:D
"MM" - не является 16-чным представлением числа в строке! Естественно будет FALSE
поржать и я могу - ты на вопрос ответь - как их конвертнуть?


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: f-r-o-s-t от Июль 31, 2009, 13:02
Он и ответил, как ты можешь "ММ" конвертнуть в 16ое число ?


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: denka от Июль 31, 2009, 13:11
Код:
short dest;
qstrncpy((char *)&dest, fileData.mid(0,2).data(), sizeof(dest));


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: spectre71 от Июль 31, 2009, 13:13
1) Если что не получается смотри доку по методам которые используешь.
2) Учи C++
Ответ на твой вопрос неодназначен! Что такое "ММ"?
А если будет "AB" и "BА" - какой порядок байт должен быть?
Один из вариантов:

Код
C++ (Qt)
QFile f(fileName);
f.open(QIODevice::ReadOnly);
short val;
f.read((char*)&val, sizeof(val));
f.close();


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: spectre71 от Июль 31, 2009, 13:22
Код:
short dest;
qstrncpy((char *)&dest, fileData.mid(0,2).data(), sizeof(dest));
qstrncpy - нельзя! копирует до N или до первого 0x0.
Скорее так
short dest = *((short*)fileData.mid(0,sizeof(short)).data());


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: Alex Custov от Июль 31, 2009, 13:41
автор читает бинарное представление, с чего вы взяли, что MM - это текстовое 16-ричное число? :)

ieroglif, функции toInt() и прочее предполагают, что в bytearray-e хранится текстовое представление числа, а не бинарное. Spectre показал как надо читать.


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: f-r-o-s-t от Июль 31, 2009, 13:42
автор читает бинарное представление, с чего вы взяли, что MM - это текст? :)
Но преобразует то он именно из строки, по этому и сказали.


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: ieroglif от Июль 31, 2009, 15:24
Spectre, спасибо. документацию читаю, язык учу, но всё сразу не получается.
AX, спасибо за понимание.


Название: Re: QByteArray to int/short (прочитать и разобрать 3ds файл.)
Отправлено: romank от Июль 31, 2009, 16:01
Здесь можно изучить исходник загрузки 3DS

http://www.gamedev.ru/code/faq/?id=3576
 (http://www.gamedev.ru/code/faq/?id=3576)

Видимо так и сравнивается == 0x4D4D