Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fregloin от Октябрь 06, 2013, 10:57



Название: QDataStream запись/чтение int8,int16,float,double
Отправлено: Fregloin от Октябрь 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++ - голый Си.


Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: Hellraiser от Октябрь 06, 2013, 11:17
А в каком стандарте enum есть char???


Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: Fregloin от Октябрь 06, 2013, 11:22
А что ему мешает перевести 'Z' -> код символа?

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



Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: Fregloin от Октябрь 06, 2013, 11:25
Хм, частично рахзобрался с проблемой, почему то запись вида
Код:
static  const   char    marker = UBJSON_FLOAT;
    stream<<(quint8)marker;
пишет четыре байта, а вот если сделать так
Код:
    stream<<(quint8)UBJSON_FLOAT;
То пишется 1 байт.


Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: kambala от Октябрь 06, 2013, 11:25
у меня при касте всегда пишется правильное количество байт.

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


Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: Fregloin от Октябрь 06, 2013, 11:37
ничего против rawData не имею, но не хотелось заморачиваться с приведением типов и вычислениями офсетов при чтении и записи, если уже это реализовано до меня. Пока вроде разобрался. не стоит полагаться на оператор << >> без явного указания типа.


Название: Re: QDataStream запись/чтение int8,int16,float,double
Отправлено: kambala от Октябрь 06, 2013, 12:53
при чтении/записи через rawData позиция потока перемещается, а не остается на месте (так же, как и для операторов >> <<)