Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.128.199.88] |
|
Сообщ.
#1
,
|
|
|
Уважаемые форумчане , подскажите , а еще лучше если есть возможность пару строк кода ,
такой вопрос имеется байтовый массив, прилетает с сервера СУБД , этот массив является ответом на 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 |
Сообщ.
#2
,
|
|
|
для удобства чтобы не отвликатся на ссылки выше , кладу тут сам участок кода который непосредстввенно разгребает байтовую кучу
Скрытый текст 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); // добавляем новую строку в виртуальную таблицу }//////////////////// перебираем как бы строки |
Сообщ.
#3
,
|
|
|
Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions
|
Сообщ.
#4
,
|
|
|
Цитата AlexSudent @ да я в курсе , только формат СтекОверфлай пипец какой трудный , в смысле общаться очень тяжко Что касается программирования, то здесь по моему все умерло. Помощь в C#, ИМХО, лучше искать здесь https://ru.stackoverflow.com/questions хотя я там зарегин , и некоторые вопросы тоже там спрашиваю , но не фонтан |
Сообщ.
#5
,
|
|
|
Попалось на глаза вот такая штука
то можно использовать 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 |