Russian Qt Forum

Qt => Вопросы новичков => Тема начата: YvenTitan от Август 25, 2016, 10:27



Название: qint64 в QByteArray
Отправлено: YvenTitan от Август 25, 2016, 10:27
Здравствуйте, не подскажете, как сделать, чтобы qint64 занимал в QByteArray именно 4 байта даже если значение, хранящееся в qint64 помещается в 1 байт?
Делаю так:
QByteArray ar(1,0);
qint64 iAr = 3; //(при разных значениях получаю один и тот же размер QByteArray)
ar.append(iAr);
qDebug()<<"size = "<<ar.size();


Название: Re: qint64 в QByteArray
Отправлено: Bepec от Август 25, 2016, 10:41
А оно разве не  8 байт должно ? 64 то?
Очень просто - берём битовые операции и запихиваем по одному вплоть до полного удовлетворения.


Название: Re: qint64 в QByteArray
Отправлено: YvenTitan от Август 25, 2016, 10:48
Спасибо!


Название: Re: qint64 в QByteArray
Отправлено: Bepec от Август 25, 2016, 10:54
Так же если стороны обе на Qt (и приёмная и передающая), можно использовать QDataStream.


Название: Re: qint64 в QByteArray
Отправлено: kuzulis от Август 25, 2016, 11:14
Так же если стороны обе на Qt

Даже если просто есть обе стороны и какой-то формат общения. Наличие Qt на другой стороне не обязательно, если передаются простые типы int, float (обычно этого достаточно). 


Название: Re: qint64 в QByteArray
Отправлено: qate от Август 25, 2016, 18:39
QByteArray b(4, 0);
*(qint32*)(b.data()) = 123;
не ?


Название: Re: qint64 в QByteArray
Отправлено: Bepec от Август 25, 2016, 19:03
qate это что вы изобразили? :D

Взять указатель на char* преобразовать в quint32, разъыменовать и присвоить 123? Надо попробовать.

PS тема про quint64  как бы. И в нём 8 байт должно быть :D

PPS Нормально работает. Но на первый взгляд вызывает ужас :D


Название: Re: qint64 в QByteArray
Отправлено: Racheengel от Август 25, 2016, 20:21
PPS Нормально работает. Но на первый взгляд вызывает ужас :D

тю, а чего ужасного то? классический сишный поинтер...


Название: Re: qint64 в QByteArray
Отправлено: Bepec от Август 25, 2016, 20:55
Выглядит жутковато. Не буст, но нечто похожее :D


Название: Re: qint64 в QByteArray
Отправлено: Авварон от Август 25, 2016, 21:05
Ага, только так делать нельзя


Название: Re: qint64 в QByteArray
Отправлено: Igors от Август 26, 2016, 05:48
Выглядит жутковато. Не буст, но нечто похожее :D
А можно и так
Код
C++ (Qt)
qint64 val = 123;
assert(ba.data() + sizeof(val) <= ba.size());
memmove(ba.data(), &val, sizeof(val));

тю, а чего ужасного то? классический сишный поинтер...
То они опускают как морально устаревшее  :)


Название: Re: qint64 в QByteArray
Отправлено: Old от Август 26, 2016, 06:23
Код
C++ (Qt)
qint64 val = 123;
assert(ba.data() + sizeof(val) <= ba.size());
memmove(ba.data(), &val, sizeof(val));
Какой замечательный асерт.


Название: Re: qint64 в QByteArray
Отправлено: Bepec от Август 26, 2016, 07:53
Assert зачётный, сразу же сработает :D
ba.data()  char[0], size 8
+
sizeOf(val)  8
=
ba.data[9] :D



Название: Re: qint64 в QByteArray
Отправлено: Igors от Август 26, 2016, 09:27
Assert зачётный, сразу же сработает :D
ba.data()  char[0], size 8
+
sizeOf(val)  8
=
ba.data[9] :D
Ну это вряд ли. Хотя хз, "самый строгий" компилятор может и это пропустит  :)


Название: Re: qint64 в QByteArray
Отправлено: Old от Август 26, 2016, 09:34
Ну это вряд ли. Хотя хз, "самый строгий" компилятор может и это пропустит  :)
А причем здесь компилятор? assert проверяет рантайм.
А в вашем коде он будет срабатывать постоянно.
Конечно, можно поиграться с размером QByteArray, но вряд-ли кого устроят массивы в несколько Гб для хранения 64-битного числа... :)


Название: Re: qint64 в QByteArray
Отправлено: Igors от Август 26, 2016, 09:42
Цитировать
..на котором красовалась надпись  ВАСТОК-2
Я подошел и исправил обе ошибки: ВОСТОГ-2
:)


Название: Re: qint64 в QByteArray
Отправлено: Old от Август 26, 2016, 09:43
Цитировать
..на котором красовалась надпись  ВАСТОК-2
Я подошел и исправил обе ошибки: ВОСТОГ-2
:)
Тогда лучше не исправляйте, раз у вас так плохо это получается. Пусть будет так. А то может получиться еще хуже. :)


Название: Re: qint64 в QByteArray
Отправлено: qate от Август 26, 2016, 12:46
Ага, только так делать нельзя

что нельзя делать ?


Название: Re: qint64 в QByteArray
Отправлено: YvenTitan от Август 26, 2016, 13:24
QByteArray b(4, 0);
*(qint32*)(b.data()) = 123;
не ?
А как после этого из QByteArray опять в qint32 перевести?


Название: Re: qint64 в QByteArray
Отправлено: qate от Август 26, 2016, 15:23
qint32 i123 = *(qint32 *)b.data()


Название: Re: qint64 в QByteArray
Отправлено: Racheengel от Август 26, 2016, 16:57
Хотя вот мне лично главная проблема видится в следующем:

"чтобы qint64 занимал в QByteArray именно 4 байта"

qint64 будет всегда и везде занимать 8 байт (64 бита / 8 бит).
Иначе, это уже не qint64. Это qint32.
Запись qint32 в QByteArray гарантирует размещение всех 4 байт.
Зачем пляски с бубнами вокруг неправильной задачи? :)



Название: Re: qint64 в QByteArray
Отправлено: qate от Август 26, 2016, 21:29
Зачем пляски с бубнами вокруг неправильной задачи? :)

ну есть неправильная задача, бубен всегда есть, отчегож не сплясать, раз просят ? )