Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/49: Рейтинг темы: голосов - 49, средняя оценка - 4.78
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913

BitConverter

14.08.2011, 10:00. Показов 10294. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив байтов(с модема) Известно, что первые 2 баита содержат идентификационныи номер, третий байт - число, определяющее количество байтов данных, в остальных баитах - сами данные.
Как преобразовать эти байты в строки и положить их в DataGridView? Пробую через BitConverter.ToString, но не получается. Подскажите,пожалуйста! Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2011, 10:00
Ответы с готовыми решениями:

Как устроен BitConverter
Здравствуйте! :) Задался я тут вопросом: как работает BitConverter? Проблема в том, что у меня не сходятся "цифры". Может...

Как работает BitConverter.ToUInt32
Как "в ручную" можно преобразовать массив из четырех байтов в uint, не пользуясь классом BitConverter?

Что мне отдает BitConverter.ToUInt32?
Тестирую вот такой вот незамысловатый код, который естественно писал не я иначе бы понимал что он делает... var myIp =...

41
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 10:15
Что имено не получается?
Какой результат ожидаем и какой происходит?
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 10:27  [ТС]
Пока есть ошибки даже на стадии компиляции

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
        private void btn_ReadFromPort_Click(object sender, EventArgs e)
        {
            op.SendToPort("#rd_eeprom\r");
            Thread.Sleep(8000);
 
            int i=0;
          while ((op.stroka.IndexOf("END")) == -1)
            {
              //========================
                using ( FileStream fs = new FileStream(@"d:\testBuffer.txt", FileMode.Append, FileAccess.Write))
                fs.Write(op.buffer, 0, op.buffer.Length);
 
              //========================
                textBox1.AppendText(ToHexString2(op.buffer));
                textBox2.AppendText(BitConverter.ToString(op.buffer));
                Debug.WriteLine((BitConverter.IsLittleEndian).ToString());
                if (BitConverter.IsLittleEndian)
                {//здесь безуспешно пытаюсь положить 2 первых байта во временныи массив и вывести его в виде числа в ячейку  dataGridView1
                    byte[] temparray={op.buffer[i],op.buffer[i+1]};
 
                    dataGridView1.Rows[i].Cells[1] = (BitConverter.ToInt32(temparray,0)).ToString();//ERROR Error       Cannot implicitly convert type 'string' to 'System.Windows.Forms.DataGridViewCell'  
 
                }
 
                textBox3.AppendText(op.stroka);  
                op.SendToPort("\r"); 
                Thread.Sleep(3000);
           }
 
        }
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 10:35
dataGridView1.Rows[i].Cells[1] = (BitConverter.ToInt32(temparray,0)).ToSt ring();

//ERROR Error Cannot implicitly convert type 'string' to System.Windows.Forms.DataGridViewCell'
Вы пытаетесь присвоить ячейке строку, а нужно присвоить строку ЗНАЧЕНИЮ ячейки.
Может не понятно выразился. У нас есть строки и столбцы, конкретная строка и столбец - это ячейка. Так вот ячейка это объект со множеством своих атрибутов, одним из которых является значение, которое хранит эта ячейка, отсюда уже можно сделать далеко идущие логические выводы

То есть напишите так:
C#
1
dataGridView1.Rows[i].Cells[1].Value = (BitConverter.ToInt32(temparray,0));
Ну или в конце добавьте ToString(); как у вас.
Value можно передавать объект, а не только строку
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 10:42  [ТС]
Спасибо, это уже сделала. Возникает ошибка здесь
C#
1
2
  dataGridView1.Rows[i].Cells[1].Value = str //index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Т.е. я неправильно заполняэ временный массив?
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 10:50
Посмотрите сколько у вас столбцов и строк.
Помните, что нумерация начинается с 0.
В самом начале выбирается i=0 ряд и, как я понимаю 1 ячейка из этого ряда (что соответсвует 2-й ячейке, если у вас в строке всего 1 столбец, то ошибка может быть в это).

Получается примерно так:
Code
1
2
                       0 столбец    1 столбец
Строка 0               0 ячейка      1 ЯЧЕЙКА
Вы пытаетесь присвоить значение выделенной ячейке.
Сколько у вас их?
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 10:58  [ТС]
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
        private void btn_ReadFromPort_Click(object sender, EventArgs e)
        {
            op.SendToPort("#rd_eeprom\r");
            Thread.Sleep(8000);
 
 
           /* textBox1.AppendText(ToHexString2(op.buffer));
            textBox2.AppendText(BitConverter.ToString(op.buffer));*/
            int i=0;
            int j = 0;
          while ((op.stroka.IndexOf("END")) == -1)
            {
              //========================
                using ( FileStream fs = new FileStream(@"d:\testBuffer.txt", FileMode.Append, FileAccess.Write))
                fs.Write(op.buffer, 0, op.buffer.Length);
 
              //========================
                textBox1.AppendText(ToHexString2(op.buffer));
                textBox2.AppendText(BitConverter.ToString(op.buffer));
                Debug.WriteLine((BitConverter.IsLittleEndian).ToString());
                if (BitConverter.IsLittleEndian)
                {
                    byte[] temparray={op.buffer[0],op.buffer[1]};
                    Debug.WriteLine(BitConverter.ToString(temparray));
                    string str = Encoding.ASCII.GetString(temparray);
 
                    dataGridView1.Rows[i].Cells[0].Value = str;//ERROR Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
                }
                i++;
                textBox3.AppendText(op.stroka);  
                op.SendToPort("\r");
                
                Thread.Sleep(3000);
           }
 
        }
Добавлено через 5 минут
Столбца 3, строк - от меня не зависит. В 1 столбец каждои строки должна положить 2 баита, пробразуемых в число Для этого создаю временныи массив и записываю туда эти 2 байта(пока хочу хотя бы в 1 столбце(с номером 0) хоть что-то записалось, i - получается, что это номер строки,которыи меняется при нажатии "\r".i увеличиваю, когда нажимаю"\r" и считываю новыи буффер...
П.С.СпасибоAlessandr, что отвечаете
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 11:06
Можете выложить проект в котором это делаете?
Правда если там напрямую с устройством работаете у меня может не получиться, но хоть погляжу в чем может быть проблема.

C#
1
2
3
byte[] temparray =  {12,14};
string str = Encoding.ASCII.GetString(temparray);
dataGridView1.Rows[0].Cells[0].Value = str;
Данный код работает?
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 11:12  [ТС]
Спасибо, вот
Вложения
Тип файла: rar TestEeprom.rar (73.4 Кб, 18 просмотров)
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 11:16  [ТС]
Ваш код выдает в DataGridView занчki , кажется, марса и ноты
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 12:06
У меня при запуске после нажатия на OрenPоrt и потом нажжатии на кнопку Read ругался на то что buffer у объекта "op" не инициализирвоан, то есть равен null.

Когда передается сообщение на порт не отрабатывает событие com_DataReceived и буфер остается равным null
Как я понял это от того, что у меня устрйоства нет в COM1, так что основное описание проблемы ниже
/======================/

Вручную его изменив для работы я добился вашей ошибки. Она возникает от того, что ваш цикл перебирает все строчки и потом доходит до несуществующей строки и выводит ошибку о превышении диапазона.

Не по теме:

А ведь эту ошибку можно было сразу из кода заметить, эх, проглядел...



Так как цикл сделан с помощью while а строки приращиваются с помощью i++, то в конце концов
dataGridView1.Rows[i] указывает не несуществующий объект.
Например у нас будет 4 строки, тогда цикл отработает, i станет равным 5, а так как пятой строки нет, то получим исключение, которое вы наблюдаете.

Попробуйте в начале цикла while вставить
C#
1
2
if (i >= dataGridView1.RowCount)
    break;
Добавлено через 18 минут
Либо делайте програмно проверку после изменение строчки на необходимость новой, потом добавляйте строчку если она необходима, потому что сейчас это не отрабатывает и переменная i начинает указывать на несуществующую строку

C#
1
2
3
dataGridView1.Rows.Add();
// или если надо, чтобы новая строка была на какой-то поределнной позиции
dataGridView1.Rows.Insert()
Ах да, и когда вы закрываете порт, то обнуляете объект com, потом если снова его попытаться открыть, то com=null, и получите опять ошибку
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 12:13  [ТС]
Спасибо, что отвечаете,Alessandr! Дело в том, что из цикла while я должна уходить, если получу в буффере "END", а пока END нет, должна посылать "\r" Если ставлю break, то вылетаю почему-то не доздавшись END . Я тут еше нашла проблему Мне кажется, что нельзя использовать
C#
1
string str = Encoding.ASCII.GetString(temparray);
У меня в первых 2 баитах - число, когда делаю через GetString(temparray) , то получаю невнятные символы Попробовала просто записать 2 баита подряд в стринг(я же их из BitConverter получила), т. е. например
C#
1
2
 byte[] temparray = { 12, 14 };
string s= temparray[0].Tostring() + temparray[1].Tostring() ;
Тогда это уже похоже на int. Только вот как его преобразовать? Вообщем, совсем запуталась
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 12:41
Вам нужно сделать систему по разбору данных. Чуть ниже я откомментил пути решения.
Если выходить из цикла можно только по получению END, то в удобном месте цикла, в начале или конце добавляйте новую строку в грид.

Если вам надо преобразовать первые байты в число, то и преобразовывайте их в число
Существует фунция
C#
1
Convert.ToInt32();
Она конвертирует байт (и не только) в целое число, просто вам необходимо сейчас грамотно выстроить обработку, пути решения у вас есть.

Еще раз:
1. на каждом витке цикла вам необходимо добавлять в Grid еще одну строку с помощью Rows.Insert() или Rows.Add().

2. Необходимо точно разобрать получаемые вами данные на составляющие. Например вы получаете список байт, точно знаете что первые 2 байта число? Конвертируете в число, остальные в строки или что вам необходимо. Например int firstNum = Convert.ToInt32(op.buffer[0]);

Немножко подумать и все получится
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 12:41  [ТС]
Спасибо!Пробую! А как мне преобразовать в число 2 баита, т.е не
C#
1
int firstNum = Convert.ToInt32(op.buffer[0]);
, а именно
C#
1
op.buffer[0].ToString() +op.buffer[1].Tostring()
?
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 12:56
Цитата Сообщение от iva_a Посмотреть сообщение
Известно, что первые 2 баита содержат идентификационныи номер, третий байт - число, определяющее количество байтов данных, в остальных баитах - сами данные.
допустим у нас есть byte[] array = какие_то_данные_с_модема;
Мы точно знаем что в третьем байте количество данных, то есть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int i =0;
while ((op.stroka.IndexOf("END")) == -1)
{
  if (i >= dataGridView1.RowCount)
  {
    // Если нам необходима новая строка добавляем её
      dataGridView1.Rows.Add(); // Для вставки в конкретное место используйте Insert
   }
//  Тут у вас что-то происходит
 
  int ID = Convert.ToInt32(array[0]) + Convert.ToInt32(array[1]); // Получаем ID из суммы первого и второго байта
  int length = Convert.ToInt32(array[2]); // получаем длину данных из 3-го байта
  byte[] data = new byte[length]; // создаем массив байтов, в котором будут храниться данные, нужной длины
  array.CopyTo(data, 3); // заполняем массив данными
  dataGridView1.Rows[i].Cells[0].Value = ID; // 
  dataGridView1.Rows[i].Cells[1].Value = length;
  dataGridView1.Rows[i].Cells[2].Value = Encoding.ASCII.GetString(data);
 
// Тут снова что-то происходит
 
  i++;
}
Как я понимаю это требовалось?
Только запомните, данные тут всегда получаются идентичными, в каждой строке если array изменяться не будет
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 13:12  [ТС]
Продолжаю страдать...
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
 private void btn_ReadFromPort_Click(object sender, EventArgs e)
        {
            op.SendToPort("#rd_eeprom\r");
            Thread.Sleep(8000);
            int i=0;
            int j = 0;
          while ((op.stroka.IndexOf("END")) == -1)
          {
 
              //========================
                using ( FileStream fs = new FileStream(@"d:\testBuffer.txt", FileMode.Append, FileAccess.Write))
                fs.Write(op.buffer, 0, op.buffer.Length);
 
              //========================
                textBox1.AppendText(ToHexString2(op.buffer));
                textBox2.AppendText(BitConverter.ToString(op.buffer));
                Debug.WriteLine((BitConverter.IsLittleEndian).ToString());
                if (BitConverter.IsLittleEndian)
                {                   
                    byte[] temparray=new byte[]{op.buffer[0],op.buffer[1],op.buffer[2]};//ERROR Index was outside the bounds of the array.
                //--------------
                    int ID = Convert.ToInt32(temparray[0]) + Convert.ToInt32(temparray[1]);
                    int length = Convert.ToInt32(temparray[2]);
                    byte[] data = new byte[length];
                   // temparray.CopyTo(data, 2);
                    dataGridView1.Rows[i].Cells[0].Value = ID;
                    dataGridView1.Rows[i].Cells[1].Value = length;
                    dataGridView1.Rows.Add(1);
                   i++;
 
                }
                textBox3.AppendText(op.stroka);  
                op.SendToPort("\r");
                
                Thread.Sleep(3000);
           }
 
        }
Добавлено через 3 минуты
До данных пока не добралась, но в 3 байте не сами данные, а сколько байтов занимают эти данные. НО это уже потом ...
0
 Аватар для Alessandr
20 / 21 / 1
Регистрация: 13.08.2011
Сообщений: 51
14.08.2011, 13:12
Используйте дебагер, проверьте какого размера массив op.buffer

array.CopyTo лучше не используйте, он не так как вам надо скопирует. Попытайтесь сначало просто все байты из op.buffer как строку представить
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
14.08.2011, 15:53  [ТС]
Спасибо, пробую и дебагирую. О результатах обязательно сообщу ...
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
16.08.2011, 16:02  [ТС]
Вернулась опять к этои проблеме. В моем коде появляется лишняя строка. Я так поняла, что по умолчанию в dataGridView1 всегда существует 1 строка. Это правильно? Подскажите, пожалуйста как удалить последнюю строку(Или сделать так, чтобы она не появлялась?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
       private void button3_Click(object sender, EventArgs e)
        {
 
            for (int k = 0; k <5; k++)
            {
                if (k >= dataGridView1.RowCount)
                    break;
                else
                {  
                    dataGridView1.Rows.Add();    
                    dataGridView1.Rows[k].Cells[0].Value = k;
                }
             
            }
            dataGridView1.Rows.Remove(dataGridView1.Rows[dataGridView1.RowCount-1]);//ERROR Uncommitted new row cannot be deleted.
 
            lbl_NumRow.Text = dataGridView1.RowCount.ToString();
         }
Добавлено через 5 часов 47 минут
Как обещала, докладываю Проблема с пустой строкой так и осталась(Help!!!) A проблема была в том, что считывала с модема не все нужные байты. Т.е. нужен был 1 и 2, а считывала только 1, и, естественно вылетала ошибка, но на DataGridView и я не могла понять в чем дело!
Alessandr, еще раз - спасибо! Может с пустой строкои тоже поможете?(Наглею
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
16.08.2011, 21:46
Цитата Сообщение от iva_a Посмотреть сообщение
Я так поняла, что по умолчанию в dataGridView1 всегда существует 1 строка. Это правильно? Подскажите, пожалуйста как удалить последнюю строку(Или сделать так, чтобы она не появлялась?
dataGridView1.AllowUserToAddRows = false;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2011, 21:46
Помогаю со студенческими работами здесь

BitConverter.ToSingle возвращает целое число
Здравствуйте! Передаю в BitCoverter.ToSingle массив из четырех байт byte bytesForBitConverter = new byte { 7, 101, 202, 65 }; ...

BitConverter little-endian -> big-endian
Копирую в массив byte некоторые значения byte msg = new byte; Array.Copy(BitConverter.GetBytes(STX), 0, msg, 0, sizeof(int)); ...

Преобразование пары байт в Int16 (BitConverter.ToInt16)
Отличная функция BitConverter.ToInt16 но она подразумевает, что пара байт будет в следующей последовательности: сначала старший, а затем...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru