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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataStream запись/чтение int8,int16,float,double  (Прочитано 5524 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Октябрь 06, 2013, 10:57 »

Привет. Пишу свою обертку для чтения/записи Universal Binary JSON над QtJson.
Нужно писать/читать данные четкой размерности, как то байтиы, слова, двойные слова и т.п.
Сейчас разработка идет в x64, но формат подразумевает четкие размеры данных.
Проблема в том, что при записи QDataStream_object<<int8 фактически записывается 4 байта вместо одного.
Неужели придется задействовать write/readRawData?

Вот фрагмент кода:
Код:

enum { .., UBJSON_NULL='Z',...};

void Ubjson::push_null(QDataStream &stream)
{
    static  const   char    marker = UBJSON_NULL;
    stream<<marker;
}

Смотрю что в файле, а в файле 00 00 00 'Z'.
Может я что то недопонял.
Ах да, данные будут отправляться и читаться с сервера, который написан без использования Qt/C++ - голый Си.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Октябрь 06, 2013, 11:17 »

А в каком стандарте enum есть char???
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Октябрь 06, 2013, 11:22 »

А что ему мешает перевести 'Z' -> код символа?

скажем так, если я хочу записать 1 байт например так
stream<<(qint8)0xFF или так stream<<static_cast<quint8>(0xFF) то все равно пишется четрые байта.
Мне же нужно добиться того, что бы в поток не писались лишние нули.
Т.е. при записи байта пишется 1 байт, при слове - 2 байта, при целом/float - 4 байта, при int64/double - 8 байт.

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Октябрь 06, 2013, 11:25 »

Хм, частично рахзобрался с проблемой, почему то запись вида
Код:
static  const   char    marker = UBJSON_FLOAT;
    stream<<(quint8)marker;
пишет четыре байта, а вот если сделать так
Код:
    stream<<(quint8)UBJSON_FLOAT;
То пишется 1 байт.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Октябрь 06, 2013, 11:25 »

у меня при касте всегда пишется правильное количество байт.

а чем не нравится rawData? размер легко вычислить через sizeof для POD-типов.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Октябрь 06, 2013, 11:37 »

ничего против rawData не имею, но не хотелось заморачиваться с приведением типов и вычислениями офсетов при чтении и записи, если уже это реализовано до меня. Пока вроде разобрался. не стоит полагаться на оператор << >> без явного указания типа.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Октябрь 06, 2013, 12:53 »

при чтении/записи через rawData позиция потока перемещается, а не остается на месте (так же, как и для операторов >> <<)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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