Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Общие вопросы > BindingList<T> использовать для разбора массива


Автор: kms 19.04.17, 00:10
Уважаемые форумчане , подскажите , а еще лучше если есть возможность пару строк кода ,
такой вопрос

имеется байтовый массив, прилетает с сервера СУБД , этот массив является ответом на 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

Автор: kms 19.04.17, 01:48
для удобства чтобы не отвликатся на ссылки выше , кладу тут сам участок кода который непосредстввенно разгребает байтовую кучу
Скрытый текст

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     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); // добавляем новую строку в виртуальную таблицу
                }//////////////////// перебираем как бы строки


Автор: AlexSudent 19.04.17, 08:13
Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions

Автор: kms 19.04.17, 08:42
Цитата AlexSudent @
Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions
да я в курсе , только формат СтекОверфлай пипец какой трудный , в смысле общаться очень тяжко
хотя я там зарегин , и некоторые вопросы тоже там спрашиваю , но не фонтан

Автор: kms 24.04.17, 02:22
Попалось на глаза вот такая штука
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    то можно использовать 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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)