В какой формат файла записывает C++ MFC объект CArchive?
Я пытаюсь прочитать с помощью C# файл, написанный на CArchive. Из того, что я могу сказать, формат:
[длина следующего набора данных][данные]... и т. д.
Я все еще неясен с некоторыми данными. Как мне прочитать данные даты? А как насчет поплавков, целых, двойных и т. Д.?
Кроме того, [длина следующего набора данных] может быть байтом, словом или словом. Как я знаю, когда это будет каждый? Например, для строки "1.10" данные:
04 31 2e 31 30
04
это длина, очевидно, а остальные - шестнадцатеричные значения для 1.10. Trivial. Позже у меня есть строка длиной 41 символ, но значение [длина]:
00 00 00 29
Почему 4 байта для длины? (0x29 = 41)
Основной вопрос: есть ли спецификация для формата вывода CArchive?
2 ответа
Чтобы ответить на ваш вопрос о строках, значение длины, которое хранится в архиве, само по себе имеет переменную длину в зависимости от длины и кодировки его строки. Если строка < 255
символов, один байт используется для длины. Если строка 255 - 65534
символы, используются 3 байта - 1 байт 0xFF
маркер, за которым следует 2-байтовое слово. Если строка 65535+
символы, используется 7 байтов - 3 байта 0xFF 0xFF 0xFF
маркер, сопровождаемый 4-байтовым мечом. Чтобы сделать это еще более сложным, если строка в кодировке Unicode, значению длины предшествует 3 байта 0xFF 0xFFFE
маркер. Таким образом, в любой комбинации вы никогда не увидите 4-байтовую длину, поэтому то, что вы показали, должно быть 3 0x00
байты, принадлежащие чему-то другому, за которыми следует длина строки в 1 байт 0x29
,
Итак, правильный способ прочитать строку таков:
Предположим: строковые данные являются анси, если не указано иное.
Прочитайте байт. Если его значение < 255, длина строки - это значение, перейдите к 3.
Прочитайте слово. Если его значение
0xFFFE
, строковые данные - Unicode, переход к 1. В противном случае, если его значение < 65535, длина строки - его значение, переходите к 3. В противном случае читайте двойное слово, длина строки - его значение, переходите к 3.прочитайте номер длины строки из 8-битных или 16-битных значений, в зависимости от того, является ли строка анси или юникод, и затем при необходимости преобразуйте в требуемую кодировку.
Согласно документации:
Основную реализацию CArchive можно найти в ARCCORE.CPP.
Если у вас нет источника MFC, посмотрите это.