** 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
В общем, плохо, когда нет документации на это дело.
Наверное надо будет спросить на форумах по Visual C++
пусть тамошние спецы и отвечают за свой Visual C++
а то блин никакой переносимости программ из-за
использования ихних классов
Отредактировано Admin — 08/11/2005, 20:09
|
|
Gedeon |
Отправлено: 09.11.2005, 13:59 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Admin @ 08/11/2005, 20:00) | пусть тамошние спецы и отвечают за свой Visual C++
а то блин никакой переносимости программ из-за
использования ихних классов |
Ламеры МФК писали
|
|
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
|
Привет.
Извиняюсь что открыл снова тему
но я не понял
Почему тогда там лежит три байта и если их все-таки должно быть три, то почему первый не 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
|
|