C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Формат CArray при сохранении в файл из Visual C++?
** Admin
Отправлено: 07.11.2005, 18:24


Не зарегистрирован







Приходиться переделывать чужую программу с Visual C++ на С++Builder

Переделывать — точнее — писать свою на C++Builder, но чтобы
осталась совместимость с некими двоичными файлами данных,
сохраненными старой программой, написанной на Visual C++.

Сохранение в Visual C++ в двоичные файлы выполнялось
через методы Serialize(). Как сохраняются часть данных (CString и пр.)
через эти методы я разобрался.

А вот как происходит сохранение m_MyData.Serialize( );
класса типа
CODE

CArray <CPoint,CPoint>m_MyData


как данные этого типа храняться в двоичном файле ?
может кто сталкивался, знает ?

(Читать придется FileRead() )
** Admin
Отправлено: 07.11.2005, 19:43


Не зарегистрирован







Частично разобрался, но не пойму заголовок.
Там по-видимому написано кол-во элементов массива,
кажется первые 2 байта ???
потом какой-то 1 байт пустой ???
потом идут по 4 байта int x и int y для каждой точки Point

Что-за пустой байт непонятно.
Георгий
Отправлено: 07.11.2005, 21:41


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



может быть на размер массива отводится 3 байта?
Admin
Отправлено: 08.11.2005, 20:00


Владимир

Группа: Администратор
Сообщений: 1190



Странный размер — 3 байта.

В FAR-е эти три байта выглядят так:
(например для 6 элементов массива)

00 06 00 далее идут по 4 байта сам массив
и 1 байт в конце файла завершающий,
в нем лежит FF

Скорее всего в этом байте лежит что-то еще.
(Сейчас там 0, но может быть еще что-то бывает)

CString использует 1 байт, далее строка указанной
в этом байте длины без завершающего 0.

В других классах приходиться переставлять местами
байты чтобы "правильно" получать данные
(старший-младший)

Все остальное кроме этого уже нормально работает,
а тут придется еще конечно разбираться, что может быть.

Может конечно размер лежит в двух байтах 00 06
а следующий байт относиться уже к первому
элементу массива.
Тогда завершабщий получается 2 байта FF FF
В общем, плохо, когда нет документации на это дело. wink.gif


Наверное надо будет спросить на форумах по Visual C++
пусть тамошние спецы и отвечают за свой Visual C++
а то блин никакой переносимости программ из-за
использования ихних классов biggrin.gif

Отредактировано Admin — 08/11/2005, 20:09
Gedeon
Отправлено: 09.11.2005, 13:59


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Admin @ 08/11/2005, 20:00)
пусть тамошние спецы и отвечают за свой Visual C++
а то блин никакой переносимости программ из-за
использования ихних классов biggrin.gif

Ламеры МФК писали smile.gif
Admin
Отправлено: 10.11.2005, 11:04


Владимир

Группа: Администратор
Сообщений: 1190



Там ответили (rsdn.ru):

CODE

CArray<...>::Serialize( ) в начале записывает количество элементов ввиде префиксного кода.
т.е. если елементов меньше 255 то записывется один байт содержащий это количество.
иначе записывается один байт равный 255 (0xFF) и
Далее проверяется, если количество меньше MAX_USHORT(0xFFFF) то дальше пишется два байта
содержащие коичество элементов ИНАЧЕ ... все повторяется до 4 или 8 байт в зависимости от версии MFC и настроек проекта.
Далее идут данные без каких-либо изменений.
// Запись
int count = arr.size();
if (cont < 0xFF)
 WriteByte(count);
else
{
 WriteByte(0xFF);
 if (count < 0xFF)
    WriteWord(count)
 else
 {
    WriteWord(0xFFFF);
    WriteLong(count);
 }
}
WriteBuf(arr.data(), count * sizeof(item_type))

// Чтение
int count = ReadByte();
if (count == 0xFF)
{
  count = ReadWord();
  if (count == 0xFFFF)
      count = ReadLong();
}
// alloc
// ..
ReadBuf(arr.data(), count * sizeof(item_type))



Все, спасибо.
Asher
Отправлено: 10.11.2005, 11:16


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Извиняюсь что открыл снова тему wink.gif
но я не понял sad.gif
Почему тогда там лежит три байта и если их все-таки должно быть три, то почему первый не FF
Admin
Отправлено: 10.11.2005, 11:25


Владимир

Группа: Администратор
Сообщений: 1190



Пытаюсь разобраться.

На Builder-e разобрался бы быстро: создал-бы новый проект,
в нём записал бы в файлы разное количество элементов
(например 0,1,10,100,254,255,256, 500, 1000 и т.д.)
CODE

CArray <CPoint,CPoint>m_MyData методом Serialize()

и смотрел-бы полученный двоичный код в каждом случае.

VC++ нет под рукой, да в нем и не разбираюсь к сожалению
на должном уровне.

Отредактировано Admin — 10/11/2005, 11:26

Вернуться в Вопросы программирования в C++Builder