В какой формат файла записывает 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,

Итак, правильный способ прочитать строку таков:

Предположим: строковые данные являются анси, если не указано иное.

  1. Прочитайте байт. Если его значение < 255, длина строки - это значение, перейдите к 3.

  2. Прочитайте слово. Если его значение 0xFFFE, строковые данные - Unicode, переход к 1. В противном случае, если его значение < 65535, длина строки - его значение, переходите к 3. В противном случае читайте двойное слово, длина строки - его значение, переходите к 3.

  3. прочитайте номер длины строки из 8-битных или 16-битных значений, в зависимости от того, является ли строка анси или юникод, и затем при необходимости преобразуйте в требуемую кодировку.

Согласно документации:

Основную реализацию CArchive можно найти в ARCCORE.CPP.

Если у вас нет источника MFC, посмотрите это.

Другие вопросы по тегам