У меня есть файл в котором есть начало считывания строкового значения C1 00 00 00 (193 офсет) и кол-во строк 0F 00 00 00 (15), строки разделяются 0x00 + 8 левых байт Как мне занести в array эти строки? Вот как код выглядит в 010 Editor С++
struct Names{
string Char;
FSkip(8);
} ;
struct Name{
for( i = 1; i <= fileSummary.NameCount; i++ ){
Names ssssssssssss <open=true>;
}
} name <open=true>;
Если файл не слишком большой, удобнее всего вычитать его целиком в память (например, используя метод File.ReadAllBytes
) и просканировать обычным циклом. Этот ответ и пример полностью полагается на предположение что файл не слишком большой.
В цикле необходимо будет конвертировать массивы байт в .NET типы. Для получения числа из массива байт удобно использовать класс BitConverter. Этот класс предполагает что число записано в Little Endian. К счастью, у вас в условии именно такой порядок байт.
Для получения строки из массива байт можно использовать класс Encoding. В условии не указано, в какой кодировке хранится текст в файле. Для упрощения я предположил что используется кодировка ASCII (таким образом, я могу воспользоваться преднастроенным экземпляром Encoding доступным через статическое свойство Encoding.ASCII). Тем не менее, пример можно легко переделать под другие кодировки. В большинстве случаев должно быть достаточно выбрать подходящее статическое свойство класса Encoding (Unicode, UTF8, и т.д.).
Для того, чтобы не вводить дополнительные переменные (список строк для хранения результата, список байт для чтения строки), в нижеприведенном примере используется функция, которая выделяет строки напрямую из массива байт с помощью индексов, и использует оператор yield
чтобы автоматически добавить строку в перечислитель. Т.к. такой подход немного усложняет код (в пользу краткости), я так же добавил комментарии в тех местах, где теоретически может быть непонятно.
/// <summary>
/// Читает из файла N строк закодированных в формате ASCII. Число N задается вторым двойным
/// словом в начале файла.
/// </summary>
/// <param name="bytes">Массив байт</param>
/// <returns>Возвращает перечислитель строк, который можно использовать в цикле foreach</returns>
static IEnumerable<string> GetLines(byte[] bytes) {
// прочитать смещение и число строк записанные в начале файла
// по заданию, каждое значение занимает 4 байта (dword)
// в .NET 4 байта занимают Int32 (int) и UInt32(uint)
// в этом примере выбран Int32 для урощения кода,
// т.к. метод ASCII.GetString требует параметры этого типа.
Int32 offset = BitConverter.ToInt32(bytes, 0);
Int32 linesCount = BitConverter.ToInt32(bytes, 4);
int start = offset; // используется для запоминания начала строки
// перечисляем каждый байт пока не получим все строки или не закончится массив
for (
int i /*позиция в массиве*/ = offset,
n /*счетчик строк*/ = 0;
i < bytes.Length && n < linesCount; i++) {
if (bytes[i] == 0) { // значит достигли конца строки
// вычисляем смещение начала строки и длину строки
int index = start;
int count = i - start;
// ---
i += 8; // отступаем 8 байт чтобы попасть в начало следующей строки
n++; // увеличиваем счетчик строк
// запоминаем начало следующей строки.
// i засинхронизируется со start по завершении цикла командой i++
start = i + 1;
// добываем строку текста и добавляем ее в перечислитель командой yield return
yield return Encoding.ASCII.GetString(bytes, index, count);
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Для вывода картинки в WPF я конвертирую иконку от файла в формате bitmap в формат, который будет отображаться в контролеВот код