На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> BindingList<T> использовать для разбора массива , интерпретация byte[] в колекцию
    Уважаемые форумчане , подскажите , а еще лучше если есть возможность пару строк кода ,
    такой вопрос

    имеется байтовый массив, прилетает с сервера СУБД , этот массив является ответом на SQL-запрос,

    требуется разобрать эту байтовую кучу т.е. преобразовать в читаемые данные которые можно вывести на экран

    один из методов тут на сайте уже пару недель обкатываю , особенно ребята в ветке на С\С++ помогли,

    теперь вот хотелось бы на С# ,

    так вот как использовать " универсальную коллекцию, которая поддерживает привязку данных." тобишь BindingList<T>
    скажите читай доки - читал, читаю и буду читать

    повторюсь еще раз с вводными данными , чтобы не прыгать на соседние ветки все нужное положу тут ,
    все предыдущие исходники , проекты на С/С++ , С# , сам сервер СУБД HyTech(не требуется установка просто ложится на D:\ и запускается) с тестовой БД уже внутри , DLL-ки "API клиентской части СУБД HyTech 2.5 (hscli)"
    https://github.com/vovakms

    документация на DLL-ки "API клиентской части СУБД HyTech 2.5 (hscli)" https://hytechdb.ru/index.php?s=docs&ru=V25...li/txt_func.htm
      для удобства чтобы не отвликатся на ссылки выше , кладу тут сам участок кода который непосредстввенно разгребает байтовую кучу
      Скрытый текст

      ExpandedWrap disabled
         DataTable dT = new DataTable(); // создаем виртуальную пустую таблицу
                   for (int n = 0; n < pCol; n++)  //создаем в этой виртуальной таблице необходимое количество колонок  
                   {                                                      // названия колонок берем из структуры infCol    
                        dT.Columns.Add(Encoding.GetEncoding(866).GetString(infCol[n].fname).TrimEnd('\0'));
                   }
                   DataRow dR; //  строка в виртуальной таблице
                    
                   MemoryStream memStream = new MemoryStream(bufOut); // Создаем поток, хранилищем которого является память.
                    BinaryReader reader = new BinaryReader(memStream);// Создаем "Считыватель примитивных типов данных как двоичных значений в заданной кодировке"
         
                    byte[] tempBuf; // временный байтовый массив
                    
                   for (int i = 0; i < pStr; i++)// перебираем в нашем байтовом одномерном массиве  как бы строки
                    {
                     dR = dT.NewRow(); // создаем новую строку в виртуальной таблице
                     for (int j = 0; j < pCol; j++)//перебираем в байтовом массиве как бы поля на каждой строке
                     {
                       switch (infCol[j].type)// в зависимости от того какой тип прилетел на данную колонку
                            {         // то указанную в infCol[j].len длину байтов приобразовываем в соответствующий тип
                                case 0: // 0 "Массив символов длиной не более заданной"
                                tempBuf = new byte[(int)infCol[j].len];// делаем временный буфер размером ширене колонки
                                reader.Read(tempBuf, 0, (int)infCol[j].len); // в потоке читаем во временный буфер вот столько байтов infCol[j].len - ширрина колонки      
                                dR[j] = Encoding.GetEncoding(866).GetString(tempBuf);// декодируем tempBuf и ложим в виртуальную таблицу                      
                                    break;
                                    
                         case 1: // 1 "Массив байтов заданной длины"
                                 tempBuf = new byte[(int)infCol[j].len]; // временный массив размером в ширину колнки
                                 reader.Read(tempBuf, 0, (int)infCol[j].len);// читаем в этот массив байты
                                 dR[j] = BitConverter.ToString(tempBuf);//  декадируем и в виртуальную таблицу
                                 break;
                                          
                          case 2: // 2 "Элемент - unsigned char" (короткое целое)  short
                                            dR[j] = reader.ReadByte() ; //
                                 break;
                                        
                          case 3: // 3 "Элемент - signed short"  
                                 dR[j] = reader.ReadInt16(); //
                                 break;
         
                          case 4: // 4 Элемент - unsigned short  
                                            dR[j] = reader.ReadUInt16();
                                            break;
         
                          case 5: // 5 Дата    - unsigned short  
                                             dR[j] = reader.ReadUInt16();
                                             break;
         
                          case 6: //6  Номер   - 3-х байтовое целое без знака  
                                             //textBox4.AppendText(infCol[j].type + " ");
                                           break;
         
                          case 7: //7 Элемент - long int
                                              dR[j] = reader.ReadInt32();
                                           break;
         
                          case 8: // 8 Элемент - unsigned long int  в БД это dword
                                             dR[j] = reader.ReadInt32();
                                            break;
         
                          case 9: //    9  Элемент - float
                                            dR[j] = reader.ReadSingle();
                                         break;
         
                          case 10: //   10 Деньги (double)  
                                           dR[j] = reader.ReadDouble();
                                          break;
         
                          case 11: // 11 Элемент - double  
                                             dR[j] = reader.ReadDouble();
                                          break;
         
                          case 12: //   12 Элемент - signed __int64
                                             dR[j] = reader.ReadInt64();
                                           break;
                          case 13: //   13 Элемент - unsigned __int64
                                            dR[j] = reader.ReadUInt64();
                                           break;
         
                            }// switch
                        }/////////////////
                        dT.Rows.Add(dR); // добавляем новую строку в виртуальную таблицу
                    }//////////////////// перебираем как бы строки

        Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions
          Цитата AlexSudent @
          Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions
          да я в курсе , только формат СтекОверфлай пипец какой трудный , в смысле общаться очень тяжко
          хотя я там зарегин , и некоторые вопросы тоже там спрашиваю , но не фонтан
            Попалось на глаза вот такая штука
            ExpandedWrap disabled
              то можно использовать StructLayout Sequential и маршалить
               
              public T ReadStruct<T> (Stream fs)
              {
                  byte[] buffer = new byte[Marshal.SizeOf(typeof( T))];
                  fs.Read(buffer, 0,  Marshal.SizeOf(typeof(T)));
                  GCHandle handle = GCHandle.Alloc(buffer,    GCHandleType.Pinned);
                  T temp = (T)    Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
                  handle.Free();
                  return temp;
              }
              С#-way (Для Big-Enddian нужен свой BinaryReader)
               
              public ProcessorId(BinaryReader br)
              {          
                  // где br это new BinaryReader(new MemoryStream(data));
                  Id0 = br.ReadUInt32();
                  Id1 = br.ReadUInt32();
              }
               
              // используем
              var data = USB.Get();
              var br = new BinaryReader(new MemoryStream(data));
               
              var a1 = new ProcessorId(br);
              var a2 = new ProcessorId(br);
              var a3 = new ProcessorId(br);


            Добавлено
            по идее что летит по USB что с сервера SQL
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0373 ]   [ 17 queries used ]   [ Generated: 28.03.24, 10:10 GMT ]