2012-06-28 4 views
1

Я пытаюсь получить заголовок файла dmg. Я видел это a link , которые мне очень помогают. Итак, я делаю программу на C++, чтобы получить все это.Заголовок Apple Disk Image

здесь:

struct Header 
{ 
int img; 
char tag[4]; 
short size; 
short version; 
int format; 
int flag; 
int num_block; 
int offset; 
int length; 
int offset_comment; 
int length_comment; 
int offset_creator; 
int length_creator; 
char space[16]; 
}; 

void read_header(const char *path) 
{ 
Header head; 

FILE *file = fopen(path, "rb"); 


fread(&head, 1, sizeof(Header), file); 

printf(" size short = %d\n", sizeof(short)); 
printf(" size int = %d\n", sizeof(int)); 
printf(" size struct = %d\n", sizeof(Header)); 

printf("img %d\n", head.img); 
printf("tag %s\n", head.tag); 
printf("size %d\n", head.size); 
printf("version %d\n", head.version); 
printf("format %d\n", head.format); 
printf("flag %d\n", head.flag); 
printf("num_block %d\n", head.num_block); 
printf("offset %d\n", head.offset); 
printf("length %d\n", head.length); 
printf("offset_comment %d\n", head.offset_comment); 
printf("length_comment %d\n", head.length_comment); 
printf("offset_creator %d\n", head.offset_creator); 
printf("length_creator %d\n", head.length_creator); 

} 

И я получаю это:

size short = 2 
size int = 4 
size struct = 64 
img 152133 
tag 
size 0 
version 0 
format 0 
flag 0 
num_block 0 
offset 0 
length 0 
offset_comment 0 
length_comment 0 
offset_creator 0 
length_creator 0 

Я не знаю, почему все мое значение равны нулю, кроме первого. Мои файлы dmg хороши, и я могу открыть его. Кто-нибудь знает, почему я получаю нулевое значение?

+0

Попробуйте использовать '[[упакованный]]' (C++ 11) или '__attribute __ ((упакованный))' (C++ 03, GCC/лязг). –

+0

Прошу прощения, но где я могу поместить это ключевое слово? – kavaliero

+0

Я пытаюсь добавить его в конце моей структуры следующим образом: struct Header {...} __ атрибут __ ((__ставленный__)); но id ничего не сделал, всегда тот же результат – kavaliero

ответ

2

Во-первых, когда вы сталкиваетесь с такими ошибками, лучше всего просмотреть данные в его исходной форме, чтобы определить, связана ли проблема с вашим кодом или с данными, которые он пытается интерпретировать.

В этом случае ваша проблема заключается в том, что формат файла отличается: при создании файла .dmg с помощью дисковой утилиты он выглядит не так, как формат, указанный на странице wikipedia.

Другими словами - ваш код в порядке, проблема связана с данными, которые он обрабатывает.

Оказывается, что «заголовок» для файла .dmg фактически хранится в конце файла - такие инструменты, как dmg2img - http://vu1tur.eu.org/tools/, могут использоваться для синтаксического анализа данных; плюс он содержит лучшее определение заголовка, чем тот, который вы используете.

+1

Чтобы разместить на нем более точную информацию, документация, которую вы ищете в Википедии, предназначена для более старый формат .IMG, используемый Disk Copy в Mac OS 9. Формат .dmg даже не выглядит удаленно похожим. – duskwuff

+0

Итак, мой dmg генерируется с помощью «hdiutil convert -format UDRo», поэтому ни один сжатый img не доступен только для чтения. Но как я могу разобрать этот заголовок так? с конструкцией C++.? – kavaliero

+0

Вы можете проанализировать «заголовок», который находится в конце файла, ссылаясь на источник dmg2img – Petesh