Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Доброго времени суток!
Собственно сабж в сабже =)

Имею некоторый массив байтов типа object. В этом массиве "зашифрованы" некоторое кол-во нужных мне данных (кол-во переменных и их порядок известны) разных типов (string, float, int и тд). Задача - разобрать этот массив и вычленить необходимую информацию.

Что делаль:
1) Пробую просто:
 Console.WriteLine(Encoding.UTF8.GetString(obj, 0, 20)); 

Логично не работает, просит byte[].

2) Пробую быстро:
BinaryFormater bf = new BinaryFormater();
byte[] bytesArr;
Using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
bytesArr = ms.ToArray;
Console.WriteLine(Encoding.UTF8.GetString(bytesArr, 0, 20));
}

Что-то получаю, но получаю ахинею. В bytesArr лежит вообще что-то "левое", а не исходный массив. Еще и сам массив из исходных 578 элементов вырос до 606.

3) Пробую BinaryReader:
BinaryFormater bf = new BinaryFormater();
Using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
Using (BinaryReader reader = new BinaryReader(ms))
{
Console.WriteLine(reader.ReadString());
}
}

Получаю exeption: Unable to read beyond the end of the stream.

4) пробую с BinaryReader.PeekChar:
BinaryFormater bf = new BinaryFormater();
Using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
Using (BinaryReader reader = new BinaryReader(ms))
{
while (reader.PeekChar() > -1)
{
Console.WriteLine(reader.ReadString());
}
}
}

В тело цикла не попадаю, видать reader.PeekChar() не находит следующий символ, а в самом reader _buffer лежит та же ерунда, что и в попытке №2, но всего 256 элементов.

Короче, запутался и замучился. Ребят, как этот массив разобрать?

Зы: По форуму смотрел, темы есть, не помогло. Гугль читал, инфы много, не получилось. MS FM курил, но видать слабО...
21 фев 19, 10:53    [21816075]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4605
Мысль про банальный тайпкастинг к byte[] в голову не приходила?
21 фев 19, 11:25    [21816102]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen,

var myObj = new MyObj()
myObj.Read(byte[]источник);
...
public virtual ImyObjectDemo Read( byte [data]) {
       using (Stream stream = new....
                return Read(stream) ;
Далее BinaryReader(stream
21 фев 19, 11:25    [21816105]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Сон Веры Павловны,

Приходила. Варианты реализации подскажешь?)
21 фев 19, 14:34    [21816407]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Petro123,

Эмм... не понял, а зачем? можно как-нибудь подробнее..
21 фев 19, 14:35    [21816408]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145536
mozgen
Сон Веры Павловны,

Приходила. Варианты реализации подскажешь?)

object o = new byte[] { 1, 2, 3, 4, 5 };
byte[] b = (byte[])o;
21 фев 19, 14:52    [21816437]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
Petro123,

Эмм... не понял, а зачем? можно как-нибудь подробнее..
что зачем?
По ООП я твои зашифрованные данные записал в класс myObj.
Пропиши там твои поля и пробуй.
21 фев 19, 15:06    [21816461]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
Cat2,

)))
21 фев 19, 15:06    [21816463]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
зашифрованы" некоторое кол-во нужных мне данных (кол-во переменных и их порядок известны) разных типов (string, float, int и тд)
покажи класс с этими переменными
21 фев 19, 15:08    [21816469]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145536
Petro123
mozgen
зашифрованы" некоторое кол-во нужных мне данных (кол-во переменных и их порядок известны) разных типов (string, float, int и тд)
покажи класс с этими переменными

Ты думаешь там есть класс?
21 фев 19, 17:55    [21816678]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
Cat2,
)) я просто напомнил, что "руки мыть хорошо перед едой".
Ну и загрузил ТС работой.
Пусть работает.
21 фев 19, 18:56    [21816772]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Petro123
покажи класс с этими переменными

Cat2
Ты думаешь там есть класс?

Совершенно верно, нет у меня никакого класса. По сути, я и что хранится в этом массиве знаю условно приблизительно.

Petro123
Ну и загрузил ТС работой.
Пусть работает.

Вот уж спасибо! =)

В любом случае, я просил подсказать в какую сторону копать. Будем пробовать. =)
22 фев 19, 06:07    [21816966]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Изопропил
Member

Откуда:
Сообщений: 30998
mozgen,

Уверен в том, что тебе нужна десериализвция?
22 фев 19, 08:08    [21816984]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
По сути, я и что хранится в этом массиве знаю условно приблизительно.
не выйдет. Надо точно знать что там. Иначе заголовок нужен.
22 фев 19, 08:14    [21816988]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1319
mozgen
По сути, я и что хранится в этом массиве знаю условно приблизительно.

А что это такое, откуда берётся? Чем данные "зашифрованы"? Может Protocol Buffers какой?
22 фев 19, 08:43    [21816996]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Изопропил,

нееет, не уверен =)

Petro123
не выйдет. Надо точно знать что там. Иначе заголовок нужен.

Понятно. Скажем так, у меня есть некоторый "конфигурационный" файл, в котором описана структура. Например:
<Types>
 <Type name="typeA">
  <String name="str" Length="20">
  <Float name="floatVal">
  <Int name="intVal">
 <Type/>
  <Type name="typeB">
  <String name="str" Length="20">
  <Float Length="4" name="floatVal">
  <Int Length="2" name="intVal">
 <Type/>
<Types/>

По идее, в получаемом мной объекте, элементы массива должны располагаться именно в том порядке, в каком указаны в конфиге.
Ну допустим, разобрать этот конфиг и создать необходимый класс со всеми подкласами я могу. В результате получим что-то типа такого:
Class types
{
 Class typeA
 {
   public string str;
   public float floatVal;
   public int intVal;
   public typeAFill(string str1, float floatVal1, int intVal1)
   {
     str = str1;
     floatVal = floatVal1;
     intVal = intVal1;
   }
 }
 Class typeB
 {
   public string str;
   public float floatVal;
   public int intVal;
   public typeAFill(string str1, float floatVal1, int intVal1)
   {
     str = str1;
     floatVal = floatVal1;
     intVal = intVal1;
   }
 }
}

Ок, а дальше что?
BinaryFormater formatter = new BinaryFormater();
using (Stream stream = new Stream(bytes[])
{
 types newType = (types)formatter.Deserialize(stream);
}


Или как?
22 фев 19, 08:52    [21816999]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Дмитрий Мух,
Читаю с PLC. Зашифрованы вообще не правильное слово, разве что "удобное". Я так понимаю, что это эдакая "унификация". Вместо того, чтоб постоянно слать/читать овермного переменных разных типов, их проще все собрать в unsignedByte массив и скопом отправить клиенту. А клиенту зная структуру можно их разобрать в удобоваримый вид. вот задачу клиента и пытаюсь реализовать.
22 фев 19, 08:57    [21817002]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen,
Вы изобрели сериализацию?
22 фев 19, 09:06    [21817005]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
есть некоторый "конфигурационный" файл, в котором описана структура.
его руками пишут?
22 фев 19, 09:07    [21817006]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
Я так понимаю, что это эдакая "унификация". Вместо того, чтоб постоянно слать/читать овермного переменных разных типов, их проще все собрать в unsignedByte массив и скопом отправить клиенту. А клиенту зная структуру можно их разобрать в удобоваримый вид. вот задачу клиента и пытаюсь реализовать.
бред какой то.
22 фев 19, 09:08    [21817009]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Petro123,
Petro123
Вы изобрели сериализацию?

Не понял.
Petro123
его руками пишут?

Угу. Пишут. Один раз. когда-то давно.
Petro123
бред какой то.

Что есть, то и едим. =)
22 фев 19, 09:15    [21817016]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Изопропил
Member

Откуда:
Сообщений: 30998
mozgen,

Конфигурации файл это хорошо,
Данные как записывают?
22 фев 19, 09:25    [21817025]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Изопропил,
Куда записывают? в массив? - понятия не имею. По сути, у меня в ту логику и доступа-то нет...
22 фев 19, 09:31    [21817030]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen
Petro123
Вы изобрели сериализацию?

Не понял.
прочтите в википедии.
Это передача классов по проводам не в виде электронов, а в виде байт.
У вас же то же самое?
22 фев 19, 09:35    [21817032]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37069
mozgen,
Если конфиг не меняется (вам решать), то делаете из него не ваши классы, а руками читаете xml и читаете стрим с байтами.
Всё.
22 фев 19, 09:39    [21817034]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить