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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: qint64 в QByteArray  (Прочитано 9756 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Август 25, 2016, 10:27 »

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

А оно разве не  8 байт должно ? 64 то?
Очень просто - берём битовые операции и запихиваем по одному вплоть до полного удовлетворения.
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #2 : Август 25, 2016, 10:48 »

Спасибо!
Записан
Bepec
Гость
« Ответ #3 : Август 25, 2016, 10:54 »

Так же если стороны обе на Qt (и приёмная и передающая), можно использовать QDataStream.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Август 25, 2016, 11:14 »

Так же если стороны обе на Qt

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

ArchLinux x86_64 / Win10 64 bit
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #5 : Август 25, 2016, 18:39 »

QByteArray b(4, 0);
*(qint32*)(b.data()) = 123;
не ?
Записан
Bepec
Гость
« Ответ #6 : Август 25, 2016, 19:03 »

qate это что вы изобразили? Веселый

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

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

PPS Нормально работает. Но на первый взгляд вызывает ужас Веселый
« Последнее редактирование: Август 25, 2016, 19:09 от Bepec » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Август 25, 2016, 20:21 »

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #8 : Август 25, 2016, 20:55 »

Выглядит жутковато. Не буст, но нечто похожее Веселый
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #9 : Август 25, 2016, 21:05 »

Ага, только так делать нельзя
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Август 26, 2016, 05:48 »

Выглядит жутковато. Не буст, но нечто похожее Веселый
А можно и так
Код
C++ (Qt)
qint64 val = 123;
assert(ba.data() + sizeof(val) <= ba.size());
memmove(ba.data(), &val, sizeof(val));

тю, а чего ужасного то? классический сишный поинтер...
То они опускают как морально устаревшее  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Август 26, 2016, 06:23 »

Код
C++ (Qt)
qint64 val = 123;
assert(ba.data() + sizeof(val) <= ba.size());
memmove(ba.data(), &val, sizeof(val));
Какой замечательный асерт.
Записан
Bepec
Гость
« Ответ #12 : Август 26, 2016, 07:53 »

Assert зачётный, сразу же сработает Веселый
ba.data()  char[0], size 8
+
sizeOf(val)  8
=
ba.data[9] Веселый

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 26, 2016, 09:27 »

Assert зачётный, сразу же сработает Веселый
ba.data()  char[0], size 8
+
sizeOf(val)  8
=
ba.data[9] Веселый
Ну это вряд ли. Хотя хз, "самый строгий" компилятор может и это пропустит  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #14 : Август 26, 2016, 09:34 »

Ну это вряд ли. Хотя хз, "самый строгий" компилятор может и это пропустит  Улыбающийся
А причем здесь компилятор? assert проверяет рантайм.
А в вашем коде он будет срабатывать постоянно.
Конечно, можно поиграться с размером QByteArray, но вряд-ли кого устроят массивы в несколько Гб для хранения 64-битного числа... Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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