Я работаю над частью программного обеспечения, которое анализирует изображения битового потока E01. По сути, это файлы криминалистических данных, которые позволяют пользователю сжимать все данные на диске в один файл. Формат E01 включает данные об исходных данных, в том числе хэш MD5 исходных и результирующих данных и т. д. com/p/libewf/downloads/detail?name=Expert%20Witness%20Compression%20Format%20%28EWF%29.pdf" rel="nofollow">здесь. На мою проблему:
Файл e01 содержит раздел «таблица», который представляет собой серию 32-битных чисел, смещенных в другие места в файле e01, где расположены фактические фрагменты данных. Я успешно разобрал эти данные в список, выполнив следующие действия:
this.ChunkLocations = new List<int>();
//hack:Will this overflow? We are adding to integers to a long?
long currentReadLocation = TableSectionDescriptorRef.OffsetFromFileStart + c_SECTION_DESCRIPTOR_LENGTH + c_TABLE_HEADER_LENGTH;
byte[] currReadBytes;
using (var fs = new FileStream(E01File.FullName, FileMode.Open))
{
fs.Seek(currentReadLocation, 0);
for (int i = 0; i < NumberOfEntries; i++)
{
currReadBytes = new byte[c_CHUNK_DATA_OFFSET_LENGTH];
fs.Read(currReadBytes,0, c_CHUNK_DATA_OFFSET_LENGTH);
this.ChunkLocations.Add(BitConverter.ToUInt32(currReadBytes, 0));
}
}
c_CHUNK_DATA_OFFSET_LENGTH составляет 4 байта/"32-битное" число.
Согласно спецификации ewf/e01, «старший бит в смещении данных фрагмента указывает, является ли фрагмент сжатым (1) или несжатым (0)». Об этом, по-видимому, свидетельствует тот факт, что, если я преобразую смещения в целые числа, в результатах будут большие отрицательные числа (без сомнения, для фрагментов без сжатия), но большинство других смещений кажутся правильно увеличенными, но каждый время от времени появляются сумасшедшие данные. Данные в ChunkLocations выглядят примерно так:
346256 379028 -2147071848 444556 477328 510100
Где с -2147071848 кажется, что старший бит был перевернут, чтобы указать сжатие/отсутствие сжатия.
ВОПРОСЫ: Итак, если MSB используется для обозначения наличия сжатия, то на самом деле я имею дело с 31-битным числом, верно?
1. Как игнорировать MSB/ вычислить 31-битное число при вычислении значение смещения?
2. Это кажется странным стандартом, поскольку может показаться, что он значительно ограничит размер возможных смещений, поэтому я спрашиваю, не упускаю ли я что-то? Эти смещения кажутся правильными, когда я перехожу к этим местам в файле e01.
Спасибо за любую помощь!