Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2015, 14:12   #1
Enclave
Новичок
Джуниор
 
Регистрация: 20.05.2012
Сообщений: 2
Вопрос Создание/Открытие/Редактирование файла побайтно

Суть такова:
Есть *.dat файлы, файлы структурные и их можно открыть уже существующей программой (Structorian), которая использует файлы *.strs (просто текстовики с необходимыми данными о структуре файла).
Информация в файлах обычно представляет собой либо целые числа, либо числа с плавающей запятой, либо являются текстовыми строками. Именно поля этих типов и являются основой структур.
Код:
• u8, u16, u32 (unsigned) - целое положительное (без знака) число размерностью 1, 2 или 4 байта
• i8, i16, i32 (integer) - целое положительное/отрицательное (со знаком) число размерностью 1, 2 или 4 байта
• x8, x16, x32 (hex) - целое положительное/отрицательное (со знаком) число размерностью 1, 2 или 4 байта
• float, double - число с плавающей запятой размерностью 4 или 8 байт
• str, cstr, wstr - обычная строка, строка с завершающим нулем и строка с юникод-символами
• char, wchar - обычный и юникод символы
Выглядят структуры следующим образом:
Код:
filemask="GauntletItem.dat;HelmetItem.dat;LowerItem.dat;ShieldItem.dat;ShoeItem.dat;UpperItem.dat"]

struct DfnEquipItemFile
{
	u32 nBlocks;
	u32 nBlockColumns;
	u32 nBlockSize;
	child DfnEquipItem [count=nBlocks];
}

struct DfnEquipItem [preload, tableview]
{
	u32 [tag="m_dwIndex"];
	cstr [len=64] m_strCode;
	i32 [tag="m_bExist"];
	cstr [len=64] m_strModel;
	i32 [tag="m_nIconIDX"];
	cstr [len=64] m_strName;
	i32 [tag="m_nKindClt"];
	i32 [tag="m_nItemGrade"];
	i32 [tag="m_nFixPart"];
	. . . 
	
	. . .
	i32 [tag="m_bIsTime"];
	nodename (": "+m_strCode);
}
Файлы структурированы так:
первые 4 байта (u32 nBlocks) - количество блоков в файле.
вторые 4 байта (u32 nBlocksColumns) - количество колонок в блоке.
третьи 4 байта (u32 nBlocksSize) - длина блоков в байтах.
Выглядит это так:

Далее идут уже сами блоки подряд. В Structorian это представляется в виде таблицы, блоки выстраиваются в строки первый над вторым и так далее:


К чему, собственно, я веду?
Structorian даёт достаточно возможностей и хорошо работает, но в силу специфичности и количества редактируемых файлов, нужно что-то, что облегчит страдания в плане автоматизации некоторых действий, например:
1. Добавление блока: Чтобы добавить в файл блок, нужно в HEX-редакторе добавить количество байт, равное размеру блока и изменить значение количества блоков(или зайти в Structorian, изменить значение, сохранить файл и перезагрузить файл с уже новым значением количества блоков) .
2. Редактирование сразу нескольких колонок (в Structorian просто нет такой функции).
И так далее и тому подобное.

Поэтому прошу "пинка" в нужную сторону. Что мне использовать для чтения файлов так, как делает это Structorian? Ясно одно: для каждого отдельно взятого типа данных, которые могут встретиться в файле, нужно писать свою функцию, но какие операторы мне использовать? Я слаб и глуп и, возможно, когда сюда зайду в следующий раз, уже найду решение, но не факт, что оно будет правильным с точки зрения оптимизации, поэтому прошу помощи в указании направления "куда копать?".

Всем спасибо.

Последний раз редактировалось Enclave; 02.04.2015 в 14:16.
Enclave вне форума Ответить с цитированием
Старый 02.04.2015, 16:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

окончательное представление в в виде таблицы
DbGrid + ClientDataSet

1. исходно пустой СlientDataSet
2. читаем структуру (.strs) анализируем и генерируем описания полей DefFileds (если не ошибаюсь) для данной структуры
3. создаем набор данных (ClientDataSet.CreateDataSet) и считываем исходные данные(рабочий файл)
4. начитываем из файла ВСЕ элементы блока по очереди (можно одновременно перенося в DataSet)
можно копить в обычном буфере и потом разом но по отдельности перенести в DataSet

ДЕЛАЕМ промежуточную редакцию данных в ClientDataSet так как нам удобно

и обратно
~4. берем запись из ClientDataSet
~3. собираем бинарный блок по структуре и записываем разом
или же пишем каждый элемент по отдельности
~2. записываем в файл

P.S. подозреваю что там тоже самое.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.04.2015 в 16:46.
evg_m вне форума Ответить с цитированием
Старый 02.04.2015, 16:55   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так автор вроде про реализацию пунка 2 и спрашивал.

А ClientDataSet и DbGrid это в Дельфи, а не в .NET.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа отображающая содержимое файла побайтно. ruslansh Помощь студентам 2 25.01.2013 23:33
открытие и редактирование файла с++ билдер woodik Помощь студентам 4 27.03.2012 16:28
Создание и редактирование файла (построчно) в С olegarh94 Общие вопросы C/C++ 5 21.12.2011 17:22
Создание и редактирование текстового файла sasha0123 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.12.2010 00:00
Открытие файла и создание графика на основе чисел из файла Simon..14 Общие вопросы C/C++ 8 09.06.2009 10:18