Потоковое чтение данных в Qt (30.11.2018). |
2018 - Ноябрь | |||
30.11.2018 18:14 | |||
Особенности потокового экспорта (что как записывается при каждой операции "<<"): - текст в кавычках (записывается как char*) создает 4 байта информации "сколько байт записано в поток + 1", количество байт записанной информации, один завершающий байт (терминатор?) "00". Текст "31" будет записан как префикс "00-00-00-03" (3 байта с завершающим), "33" как символ "3", "31" как символ "1", завершающий байт "00". - целочисленное число (записывается как 4-байтовый int) создает 4 байта информации. Попытка записать число больше приводит к его записи как нескольких интов. Число 258 будет записано как 4 байта "00-00-01-02". Число "4.343.434.343" будет записано как 8 байт (2 инта) "00-00-00-01 02-E3-8C-67". Отрицательные числа также успешно записываются в рамках 4 байт, вплоть до -2147483647. На практике беззнаковый целочисленный максимум упирается в 18446744073709551615 (8 байт по FF); - QString создает 4 байта информации "сколько байт записано в поток", двойное количество байт записанной информации (на 1 символ отводится 2 байта). Текстовая строка "5.1.2.1" будет записана как "00-00-00-0E" (2*7 символов), "00-35-00-2E-00-31-00-2E-00-32-00-2E-00-31" (каждый из 7 символов будет "00-xx"). На практике удалось экспортировать строку 600млн знаков, больше не смог: закончилась RAM (OpenSuse v.12.1). В Windows XP x32 при большем количестве RAM - удалось экспортировать всего 300млн знаков; - QStringList записывается по неизвестному алгоритму; - QByteArray записывается как char*; - остальные типы данных - стандартны. float и double записываются как 8 байт, short int - 2 байта, bool - 1 байт (значения 1 или 0). Общее: - поток не способен работать с переменными типа long int, long double - накладывает ограничения на экспорт; - изменение типа хотя бы одной переменной при работе с потоком может привести к ошибке импорта. То есть, жесткая привязка к типу данных; - структура файла хороша для программного чтения, но не для ручного. При наличии большого количества параметров QString/Char* приходится считать байты на распечатке; - при работе с хешем, записью в файл и потоком - перед инициализацией хеша нужно закрыть и открыть файл заново!!! |
|||
Обновлено ( 30.11.2018 18:18 ) |