Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/41: Рейтинг темы: голосов - 41, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15

Hex-Editor: как осуществить поиск по файлу

02.12.2011, 20:12. Показов 8385. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такая вот незадача возникла.
Необходимо реализовать на C# 16-ричный редактор.
Скриншот моей программы ниже
Загружается файл, читается и добавляется в ListBox
Для работы реализован класс HexItem
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 public class HexItem
    {
        // Массив из 16 байт
        public byte[] Line = new byte[16];
        // Адрес этих байт в файле
        public long Offset;
        // Количество считанных байт
        public int Counts;
        // Конструктор с параметрами
        public HexItem(byte[] Line, long Offset, int Counts)
        {
            for (int i = 0; i < Line.Length; i++)
            {
                this.Line[i] = Line[i];
            }
            this.Offset = Offset;
            this.Counts = Counts;
        }
        // А вот таким образом у меня переопределен метод ToString
        public override string ToString()
        {
            StringBuilder SB = new StringBuilder();
            SB.AppendFormat("{0:X8}", this.Offset);
            SB.Append("\t");
            // Добавляем в строку байты
            for (int i = 0; i < this.Line.Length; i++)
            {
                if (i >= this.Counts) SB.Append("   ");
                else
                {
                    SB.AppendFormat("{0:X2}", this.Line[i]);
                    SB.Append(" ");
                }
            }
            SB.Append("\t");
            // Добавляем в строку текст
            for (int i = 0; i < this.Line.Length; i++)
            {
                if ((char)this.Line[i] == '\a' || (char)this.Line[i] == '\b' || (char)this.Line[i] == '\f' || (char)this.Line[i] == '\n' || (char)this.Line[i]                    == '\r' || (char)this.Line[i] == '\t' || (char)this.Line[i] == '\v'  || (char)this.Line[i] == ' '|| i >= this.Counts) SB.Append(".");
                else SB.Append((char)this.Line[i]);
            }
            return SB.ToString();
       }
}
С помощью переопределнного метода ToString данного класса я вывожу данные в ЛистБокс.
Когда я открываю файл, то читаю данные следующим образом -
Открыл файл FIleStream-om, ставлю указатель на начало файла, и в цикле читаю по 16 байт, пока не достигну конца файла.
Вот код функции
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
               byte [] b = new byte [16];
                long Offset = 16;
                int cnt = 0;
                // Экземпляр описанного мною выше класса HexItem
                HexItem HI;
                FileStream FS = new FileStream(OFD.FileName, FileMode.Open, FileAccess.Read);
                while (Offset < FS.Length)
                {
                    // Ставим указатель в файле на нужную позицию
                    FS.Seek(Offset, SeekOrigin.Begin);
                    // Считываем по 16 байт
                    cnt = FS.Read(b, 0, 16);
                    HI = new HexItem(b, Offset, cnt);
                    // Добавляем в список новый элемент класса
                    this.listBox1.Items.Add(HI);
                    Offset += 16;
                }
                FS.Close();
Как видно на скриншоте у меня есть текстовое поле в меню, куда нужно вводить адрес, для перехода по документу.
Задание: вводится адрес в 16-ричном формате, и если есть строка с таким адресом в файле - то мы скроллим список до этой строки и выделяем ее.
Тут-то я и столкнулся с проблемой. Ведь данные я читаю как массив байтов, из которых, просто потом строю строку с их 16-ричным представлением, которую и вывожу в ЛистБокс. А данные для поиска вводятся в строке еще и не в байтовых значения а в HEX.
Нужен совет, каким образом добиться поиска по файлу.
Может что-то типа такого:
1. Строка читается из т.п.
2. Строка конвертируется в массив байт (перепробовал несколько методов) что-то у меня не вышло..
3. В цикле происходит поиск по списку, пока адрес не совпадет с введенным...
И еще такая трабла, ведь пользователь может ввести и несколько значений подряд, как тогда быть, ведь надо еще и определить правильность ввода данных. В общем ОЧЕНЬ НУЖНА ПОМОЩЬ!!!
ВСЕМ ЗАРАНЕЕ СПАСИБО!!!!!!!!!!!!
Миниатюры
Hex-Editor: как осуществить поиск по файлу  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.12.2011, 20:12
Ответы с готовыми решениями:

Осуществить поиск заданных слов по файлу
Есть файлы ( файловая система NTFS) нужно осуществить поиск заданных слов по файлу, причем проверить все потоки. Так вот, как искать в...

Осуществить поиск по файлу с возможностью редактирования данных
Напишите программу, которая запрашивает у пользователя имя, фамилию, дату рождения, номер группы и записывает данные в файл. Программа...

Подобие HEX Editor
Приветствую. Необходимо сделать подобие HEX Editor. Нужно, чтобы когда я выбрал файл, открывалось окно (либо в листбоксе и т.п.)...

10
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
02.12.2011, 21:05
Проблема в общем-то вся в том, что конечные данные находятся в ListBox, по которому крайне трудно ориентироваться и что-либо делать. При загрузке файла я бы посоветовал загружать их в свою структуру, с которой потом можно будет производить все необходимые действия, а вот уже массив этих структур отображать в ListBox, дабы последний не был основным "полигоном" для действий.
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
03.12.2011, 13:33  [ТС]
Так оно так и есть: этот функционал можно реализовать за счет класса HexItem, который описан выше. Я вот не могу разобраться как правильно делать поиск. Ведь данные читаются в виде байт, отображаются в виде Hex, и данные для поиска тоже необходимо вводить в Hex.
А метод .GetBytes как-то у меня некорректно работает.
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
03.12.2011, 13:38
Цитата Сообщение от Charlie Посмотреть сообщение
А метод .GetBytes как-то у меня некорректно работает.
вот об этом поподробнее
Про то, как отображаются данные лучше забыть вообще. Пользователь видит то, что должен, а программе-то с этим работать надо.
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
03.12.2011, 14:45  [ТС]
Сейчас, к сожалению, точный листинг привести не смогу. Но как-то так
Допустим нам нужно перейти по адресу (возьму адрес со скриншота) 2с2e45.
Значит мы получаем текст из текстового поля в меню
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
string HexText = this.Find.Menu.Text;
// затем нужно разбить ее на массив байт
 
byte [] ByteArr = new byte[HexTex.Length];
char []Arr = HexText.ToCharArray();// Не помню, правильно ли переводить строку в массив чаров
for (int i=0; i<Arr.Length; i++)
int cnt = 0;
{
     byte []N =  BitConverter.GetBytes(Arr[i]);
     for (int j=0; j<N.Length; j++)
     {
           ByteArr[cnt++] = N[j];
     }
}
// Все, массив байтов получили вроде
// теперь поиск по списку, пока не найдем совпадение
// Экземпляр класса, описанного мною в первом посте
HexItem H;
for (int i=0; i<this.Listbox1.Items.Length; i++)
{
       H= (HexItem)this.Listbox1.Items[i];
       // Если есть совпадение в адресe
       if (H.Offset == ByteArr[0])
       {
               // Делаем поиск по остальным байтам
}
// И если нашли - скроллим список до этой строки, у меня все время скрол идет до второй строки и все, я вообще сомневаюсь, правильно ли это все сделано
Спасибо
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
03.12.2011, 14:51
C#
1
2
3
            string HexText = "2с2e45";
            // затем нужно разбить ее на массив байт
            byte[] ByteArr = Encoding.Default.GetBytes(HexText);
1
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
03.12.2011, 14:59  [ТС]
Ааааа.. Я смотрел на МСДН-овский пример, не на тот метод, который оказывается нужен был.
Этот метод возвращает что-то в случае неудачи? Чтобы знать вдруг пользователь неправильно ввел адрес. И еще вопрос такой: у меня в полях класс HexItem данные об адресе хранятся в переменной Offset типа long. Ее тоже нужно преобразовывать к байтам?
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
03.12.2011, 15:36
Неудачи тут быть не может. 2 Возможных исключения:
ArgumentNullException, если null передадите в качестве текста
EncoderFallbackException, если какой-нибудь символ не получится перевести в байт(ы), но трудно сказать как Вы можете получить такое
Что касается long... Зачем тогда вообще пляски с приведением введённого пользователем адреса к массиву байт? Известно ведь, что первая строка имеет адрес 00000000, вторая 00000010, ну и т.д. Вам тогда введённое пользователем к long привести и найти HexItem по Offset.
1
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
03.12.2011, 16:22  [ТС]
Спасибо!
А вот что насчет вопроса по long: просто в задании требуется, чтобы не только по адресу был переход, а задан вариант: введен адрес и следующие за ним в строке байты....
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
06.12.2011, 14:51  [ТС]
Возникла проблема с коррректным отображением текстового значения байт, причем если выводить эти значения с помощью MessageBox - все выводится на ура. А вот при добавлении этой строки в список - выводится мало что. Нужно, как пример отредактировать с помощью моего просмотрищика exe файл, в котором есть строка Hello World. Это строка находится по тексту, мы на нее переходим, но вместо слова Hello World три жалких иероглифа((((. Попытка вывести это через MessageBox - все ок.
Судя по всему дело в неправльной кодировке, и необходимо перевести строку в ascii кодировку, но как-то не могу разорбраться как это сделать. Вот листинг вывода строки в listbox
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        public override string ToString()
        {
            StringBuilder SB = new StringBuilder();
            SB.AppendFormat("{0:X8}", this.Offset);
            SB.Append("\t");
            // Добавляем в строку байты
            for (int i = 0; i < this.Line.Length; i++)
            {
                if (i >= this.Counts) SB.Append("   ");
                else
                {
                    SB.AppendFormat("{0:X2}", this.Line[i]);
                    SB.Append(" ");
                }
            }
            SB.Append("\t");
           // Вот здесь-то я пытаюсь мой массив байт перевести в строку в Ascii и ничегошеньки(((          
            string s = System.Text.Encoding.ASCII.GetString(this.Line);
            SB.Append(s);
            return SB.ToString();
       }
    }

Всем спасибо за внимание проявленное к моей теме!
0
 Аватар для hack2root
6 / 6 / 1
Регистрация: 01.05.2012
Сообщений: 17
01.05.2012, 11:40
Мой контрольчик посмотрите, создал как раз для обучения и пойдёт

http://simplehexviewcontrol.codeplex.com/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2012, 11:40
Помогаю со студенческими работами здесь

Создать программу-Hex Editor
Всем привет. Подскажите как в visual studio создать hex editor? Так есть имеется richtextbox1 и через openfiledialog в него грузим...

Как осуществить в дельфи осуществить поиск по таблице из другой формы?
Очень выручите, плизз

Как обратиться к mif/hex файлу в FPGA?
Здравствуйте! у меня есть hex/mif файл с какими-то данными. Как загрузить эти файлы в ПЛИС, чтобы при конфигурировании ПЛИС (после...

Использование компонента Byteviewer для Hex Editor'a
Добрый день! понадобилася мне формочка для редактирования hex'а. формочка нужна на чтение и запись. После поисков в тырнетике...

В WYSIWYG editor SPAW2 ява перекодирует цвет с HEX(HTML) на RGB.
Есть открытый редактор на PHP + java. Разработчик несколько лет не отвечает на такой вопрос: яндекс принимает раскрашенный текст если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru