С# Как считать string из hex

214
22 ноября 2018, 20:20

У меня есть файл в котором есть начало считывания строкового значения 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>;
Answer 1

Если файл не слишком большой, удобнее всего вычитать его целиком в память (например, используя метод 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);
            }
        }
    }
READ ALSO
Выдвигающиеся панели

Выдвигающиеся панели

Как на WPF можно реализовать выдвигающиеся панели

185
Как конвертировать, bitmap в ImageSource, пробую не получается

Как конвертировать, bitmap в ImageSource, пробую не получается

Для вывода картинки в WPF я конвертирую иконку от файла в формате bitmap в формат, который будет отображаться в контролеВот код

163
MVVM WPF обращение к объекту из другого окна

MVVM WPF обращение к объекту из другого окна

В очередной раз столкнулся с проблемой

163