Каков формат файла, в который C ++ MFC-объект CArchive записывает? - PullRequest
5 голосов
/ 19 января 2012

Я пытаюсь прочитать с помощью C # файл, написанный на CArchive. Из того, что я могу сказать, формат:

[длина следующего набора данных] [данные] ... и т. Д.

Хотя я все еще не совсем понимаю некоторые данные. Как мне прочитать данные даты? А как насчет поплавков, целых, двойных и т. Д.?

Кроме того, [длина следующего набора данных] может быть байтом, словом или словом. Как я знаю, когда это будет каждый? Например, для строки «1.10» данные:

04 31 2e 31 30

04 - это длина, очевидно, а остальные - шестнадцатеричные значения для 1.10. Trivial. Позже у меня есть строка длиной 41 символ, но значение [длина]:

00 00 00 29

Почему 4 байта для длины? (0x29 = 41)

Основной вопрос: Есть ли спецификация для формата вывода CArchive?

Ответы [ 2 ]

8 голосов
/ 20 января 2012

Чтобы ответить на ваш вопрос о строках, значение длины, которое хранится в архиве, имеет переменную длину в зависимости от длины и кодировки его строки.Если строка < 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. </p>

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

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

3 голосов
/ 19 января 2012

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

Основная реализация CArchive находится в ARCCORE.CPP.

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

...