С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/96: Рейтинг темы: голосов - 96, средняя оценка - 4.72
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161

побайтное чтение из файла

25.08.2011, 15:03. Показов 19845. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день , нужно сделать побайтное чтение из hex файла , и добавить это в datagridview , к примеру мы имеем 10 записей , 1 запись = 22 байта , в datagridview.column[0] должно доабавлятся 20 байтов (string - название) datagridview.column[1] должно добавляться 2 байта (int - время ) , если мы имеем 10 записей это должно делаться 10 раз. Заранее благодарен.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2011, 15:03
Ответы с готовыми решениями:

Побайтное чтение *.bin файла и представление информации в 16-ом виде.
Привет всем! Кто может подсказать, как из файла прочитать байт и представить его в 16-ом виде? В тотал командере этот файл выглядит...

Побайтное чтение строки и запись в файл
Есть файл единиц и нулей, я его записываю в строку E="10010.....". Нужно перевести ее в биты(массив видимо), по значениям, то есть первые 8...

Побайтное считывание чисел из файла
Есть файл. В нем вещественные числа. Задача в том, чтобы в другой файл записать 1 и последнее число из исходного файла. Пока пытаюсь...

21
 Аватар для Merlin666
98 / 98 / 29
Регистрация: 26.12.2010
Сообщений: 220
25.08.2011, 15:07
Попробуй подключить пакет IO (using System.IO и поработай с классами BinaryReader, BinaryWriter =)
1
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
25.08.2011, 15:41  [ТС]
а можно какой нить мануальчик ? раньше таким не занимался
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
25.08.2011, 15:59
C#
1
2
3
4
byte[] result=null
using (FileStream fileStream=File.OpenRead("C:\\file.bin"))
using (BinaryReader binaryReader=new BinaryReader(fileStream))
    result=binaryReader.ReadAllBytes();
Но тут есть не мало важный момент т. к. чтение данных идет прямо в память размер возможного для чтения файла ограничен размером доступной в данный момент памяти. Конечно 220 байт это немного но вот если файл будет занимать хотя бы 22Мб уже нужно будет делать другим способом
1
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
25.08.2011, 16:13  [ТС]
Файл не превышает 10-20 мб.

Кстати в binaryReader нету функции ReadAllBytes
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
25.08.2011, 16:53
вам нужно считывать порциями по 22 байта и представлять каждую запись построчно в шестнадцатиричном виде?
C#
1
2
3
4
5
6
7
            byte[] buffer = File.ReadAllBytes(fileName);
            for (int i = 0; i < buffer.Length; i++) {
                Console.Write(buffer[i].ToString("x2"));
                if (i%22==0) {
                    Console.WriteLine();
                }
            }
в винформс по этой же логике

кстати, можете не загружать всё в массив, а налету всё делать
C#
1
2
3
4
5
6
7
8
9
10
11
12
            int b = 0;
            using(FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)){
                int counter = 0;
                do{
                    b=fs.ReadByte();
                    Console.Write(b.ToString("x2"));
                    if (counter%22==0) {
                        Console.WriteLine();
                    }
                    counter++;
                }while(b!=-1);
            }
3
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
26.08.2011, 09:14  [ТС]
Спасибо почти то что нужно, не подскажите как сделать побайтное чтение, к примеру мне нужно не с 1 байта читать а к примеру с 3 байта и до 5. Спасибо
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
26.08.2011, 10:12
C#
1
2
3
4
5
6
7
8
9
10
11
            int b = 0;
            byte[] buffer = new byte[2];
            using(FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
                fs.Seek(2, SeekOrigin.Begin);  //переходим на нужную позицию в файле, второй аргумент - относительно чего идет счет. смотрите MSDN
                for(int i = 0; i < 2; i++) {
                    b = fs.ReadByte();
                    if(b != -1) {
                        buffer[i] = (byte)b;
                    }
                }
            }
только уточните на третий или на второй элемент надо переходить в методе Seek, я не помню. если с нуля, то на второй, если с единицы идет счет, то на третий.. по идее от нуля. в общем пробуйте
1
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
26.08.2011, 11:56  [ТС]
Спасибо , ваш код помог , вот сам кое что набросал

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
//считаем 1 байт - определяем сколько записей 
fs.Seek(2, SeekOrigin.Current);  
                  for (int i = 0; i < 1; i++)
                  {
                      b = fs.ReadByte();
                      if (b != -1)
                      {
                          buffer[i] = (byte)b;
                          lomom = b * 22; // 1 запись - 22 байта , 1 байт нам говорит сколько записей b*22
                          buffer = new byte [lomom]; 
                          MessageBox.Show(Convert.ToString(lomom));//для теста что мы получили 
                      }
                  }
//читаем записи
                  fs.Seek(4, SeekOrigin.Begin);  
                  for (int ia = 0; ia < lomom; ia++)
                  {
                      b = fs.ReadByte();
                      if (b != -1)
                      {
                          buffer[ia] = (byte)b;
                          MessageBox.Show(Convert.ToString(b));//для теста что мы получили 
                          lomom--;
                      }
                  }
Вот собственно вопрос , как сделать чтобы каждый 20 байт он добавлял в datagridview1.Column[0] //20 байт мы должно перевести в string и получить название а остальные 2 байта записывать в datagridview1.column[1] // это у нас int значение , а точнее время. Спасибо
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
26.08.2011, 12:03
нужно при чтении вести счет байтов и каждый 20ый (if(counter%20==0)....) тоесть если количество счетчик кратен 20 (или же после 20го байта обнулять счетчик) парсить и заносить куда вам надо
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
26.08.2011, 14:01  [ТС]
Спасибо сделал , но у меня появилась проблема , а именно если в hex файле есть к примеру 07 08 то он 0 не записывает , получается 78 (порядок мл. байт - ст. байт , перевожу на ст.байт мл байт получаю 87 , а должен 807)Вот сам код

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
 for (int ia = 0; ia < lomom; ia++)
                  {
                      countbyte++;
                      b = fs.ReadByte();
                      if (b != -1)
                      {
                          buffer[ia] = (byte)b;
                          resultbyte = resultbyte + Convert.ToString(b);
                          if (countbyte == 20)
                          {
                              _index = dataGridView2.Rows.Add(resultbyte);
                              dataGridView2.Rows[_index].Cells[0].Value = resultbyte;
                              resultbyte = "" ;
                              
                          }
                          if (countbyte == 21)
                          {
                              onebyte = b;
                          }
                          if (countbyte == 22)
                          {
                              twobyte = b;
                              resultbyte = Convert.ToString(twobyte) + Convert.ToString(onebyte);
                              dataGridView2.Rows[_index].Cells[1].Value = resultbyte;
                              resultbyte = "";
                              countbyte = 0;
                          }
Спасибо
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
26.08.2011, 14:04
попробуйте не Convert.ToString(byteVal), а byteVal.ToString("x2")
простите, а "807" - это в шестнадцатиричной системе у вас?
1
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
26.08.2011, 16:05  [ТС]
да это в шестнадцатиричной системе , а точнее в шестнадцатиричной системе системе будет выглядеть так 0807 , но первый "0" мы как бы не считаем

Добавлено через 29 минут
эм , сделал как вы сказали , проблема следущая : если в переменную
resultss = Convert.ToInt32(resultbyte) / 60;
resultbyte попадает A,B,C,D,E,F то он вылетает с ошибкой "Входная строка имела неверный формат."
из-за Convert.ToInt32 , не подскажите во что можно конвертировать чтобы не вылетала ошибка ? Спасибо.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
29.08.2011, 09:41  [ТС]
С этим разобрался , теперь проблема с кодировкой , при добавлении у меня вот что добавляет
Àáñöåññû
Àäåíîìà ïðîñòàòû
Àäèï.-ãåí.äèñòðîôèÿ

Не подскажите как можно решить эту проблему ? Спасибо.
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
29.08.2011, 11:20
проверьте кодировку текста
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
29.08.2011, 11:37  [ТС]
а какая кодировка должна быть? у меня стоит Юникод
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
29.08.2011, 11:41
возможно там ANSII.. попробуйте поиграться с кодировками. узнать точно какая кодировка у файла проблематично. как вариант - откройте его в notepad++ - там есть в менюшке "кодировка" - посмотрите там.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
29.08.2011, 11:45  [ТС]
поигрался с кодировкой в Ansi вообще иероглифы , я думаю дело не в кодировке а в конвертации

C#
1
2
3
4
5
6
7
8
9
10
11
        public string ConvertStringToHex(string HexValue)
        {
            string StrValue = "";
            while (HexValue.Length > 0)
            {
                StrValue += System.Convert.ToChar(System.Convert.ToUInt32(HexValue.Substring(0, 2), 16)).ToString();
                HexValue = HexValue.Substring(2, HexValue.Length - 2);
            }
            return StrValue;
 
        }
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
29.08.2011, 11:49
погодите, а зачем вам конвертировать..
ладно, смотрите - у вас есть файл с текстом на сколько я догадываюсь. вы же можете его считать в байтовый массив (раз у вас стоит задача побайтового чтения файла) потом этот массив конвертировать в строку с помощью класса System.Text.Encoding. я подозреваю что вы сначала байт-массив конвертируете в хекс и потом в строку. попробуйте с байт-массива в строку напрямую - там же и укажете нужную кодировку
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
29.08.2011, 11:51  [ТС]
ну вот здесь я и конвертирую из hex в string

C#
1
2
3
4
5
6
7
if (countbyte == 20)
                          {
                              result = ConvertStringToHex(resultbyte);
                              resultbyte = "";
 
                             
                          }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2011, 11:51
Помогаю со студенческими работами здесь

Побайтное чтение файла
Подскажите, как с помощью JS реализовать побайтное чтение файла (аудио-файл если это имеет какое то значение).

readbyte, побайтное чтение из файла
Доброго времени. Подскажите как работать с побайтным чтением из файла: f = File.new(&quot;157426-1280x1024.jpg&quot;) size1 =...

Boost и побайтное чтение/запись в файл
Всем привет! Есть такой вопрос, как очень быстро скопировать файл? Скорость нужна в пределах~600 мб/сек. Возможно ли такое? Вот код,...

Как реализовать побайтное чтение из COM-port
Использую класс qextserialport! С Сom-port прилетают 8 байт! Необходимо читать первый раз 1 байт, затем 2 байта, затем 5 байт! И записывать...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru