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

Откуда:
Сообщений: 65
Petro123,
=)
Спасибо за подсказку. Но что такое сериализация я знаю, я не понял почему
Petro123
Вы изобрели сериализацию?
22 фев 19, 09:40    [21817035]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

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


Как это сделать-то?
22 фев 19, 09:47    [21817039]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Изопропил
Member

Откуда:
Сообщений: 30998
mozgen
Изопропил,
Куда записывают? в массив? - понятия не имею. По сути, у меня в ту логику и доступа-то нет...

Значит прочитать нужно неизвестно что?
22 фев 19, 09:47    [21817040]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

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


Как это сделать-то?
я код выше дал
22 фев 19, 09:52    [21817043]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
mozgen
Member

Откуда:
Сообщений: 65
Petro123,
Хорошо, давай конкретизирую: каким образом мне из потока последовательно вычленять данные в различных форматах?
22 фев 19, 10:08    [21817055]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
mozgen
Petro123,
Хорошо, давай конкретизирую: каким образом мне из потока последовательно вычленять данные в различных форматах?

Petro123
Далее BinaryReader(stream

Непонятно?
Начните писать. Хотя бы 5 минут.
22 фев 19, 10:41    [21817083]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1792
>mozgen, сегодня, 10:08 [21817055]
>Хорошо, давай конкретизирую: …
<Попробуй так
  public static class бом {
    public static MemoryStream xms      = null;
    public static byte[] xbb            = null;
    . . . 
    //-- Бинарная сериализация объекта 
    //-- вход:	object
    //-- выход:	xms <-- байтовое представление объекта
    //=========================================================
   public static bool binSerObject(object obj) {
     try {
       xms=new MemoryStream();
       BinaryFormatter binForm=new BinaryFormatter();
       binForm.Serialize(xms,obj,null);
       xms.Position=0;
       return true;
     }
     catch	{return false;}
   }
   //-- Бинарная десериализация объекта из памяти
   //-- вход: xms <-- байтовое представление объекта
   //-- выход: object
   //=========================================================
   public static object binDeSerObject() {
     try {BinaryFormatter binForm=new BinaryFormatter(); return binForm.Deserialize(xms);}
     catch {return null;	}
   }

   //-- Формируем ??-и байтовое представление string в xms
   //========================================================
   public static void StringToXMS(string st)	{
      st=st.Trim();
      if(st.Length==0) st=" ";
      byte[] bt=UnicodeEncoding.UTF8.GetBytes(st);   //-- byte[] <-- st
      ShortToXMS((short)bt.Length);
      xms.Write(bt,0,bt.Length);
  }
   //-- Восстановление string из xms
   //==========================================================
   public static string xmsToString() {
      int n=xmsToShort();
      byte[]bt=new byte[n];
      xms.Read(bt,0,n);
      return UnicodeEncoding.UTF8.GetString(bt); //-- string <--  byte[]
  }
  . . .
  //-- Формируем 4-х байтовое представление int в xms
  //=================================================
  public static void IntToXMS(int ii){byte[] bt=BitConverter.GetBytes(ii); xms.Write(bt,0,bt.Length);}
  //-- Восстановление int из xms
  //==========================================================
  public static int xmsToInt() {byte[]bt=new Byte[4];xms.Read(bt,0,4); return BitConverter.ToInt32(bt,0);}
  //-- Формируем 8-и байтовое представление long в xms
  //=================================================
  public static void LongToXMS(long ii){byte[] bt=BitConverter.GetBytes(ii); xms.Write(bt,0,bt.Length);}
  //-- Восстановление long из xms
  //==========================================================
  public static long xmsToLong(){byte[]bt=new Byte[8];xms.Read(bt,0,8); return BitConverter.ToInt64(bt,0);}
  . . . 
22 фев 19, 10:45    [21817085]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
ВМоисеев,
По моему варианту там кода 10 строк и без сериализации.
22 фев 19, 10:52    [21817091]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1792
>Petro123, сегодня, 10:52 [21817091]
>По моему варианту…
<Так это же здорово, если есть варианты.
Только у нас с Вами несколько разные предпосылки - мне мало сформировать xms, надо и упаковать и шифрануть
22 фев 19, 11:28    [21817123]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1792
>Petro123, сегодня, 10:52 [21817091]
>По моему варианту…
<Так это же здорово, если есть варианты.
Только у нас с Вами несколько разные предпосылки - мне мало сформировать xms, надо и упаковать и шифрануть
22 фев 19, 11:44    [21817144]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
ВМоисеев
Так это же здорово, если есть варианты.
+1
22 фев 19, 11:52    [21817160]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
Я так и не въехал, в каком виде приходит массив, но если это работает:
byte[] bytesArr = obj;

то все просто.

<Type name="typeA">
  <String name="str" Length="20">
  <Float name="floatVal">
  <Int name="intVal">
 <Type/>

20 байт строка + 4 байта float + 8 байт int = bytesArr.Length должно быть == 32. Или делиться на 32 без остатка - если таких записей в массиве много. Если это правило не исполняется - последняя запись битая или вообще прислали лажу. Возможно на уровне документации, а не байтов.

            var tA = new typeA
            {
                str = BitConverter.ToString(bytesArr, 0, 20), //c начала массива 20 байт
                floatVal = BitConverter.ToSingle(bytesArr, 20), //4 с 20го
                intVal = BitConverter.ToInt32(bytesArr, 24), //8 с 24го
            };
22 фев 19, 21:45    [21817675]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Изопропил
Member

Откуда:
Сообщений: 30998
Antonariy
BitConverter.ToString

уверен, что именно это требуется?
22 фев 19, 21:56    [21817678]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
Изопропил
Antonariy
BitConverter.ToString

уверен, что именно это требуется?
Нет. В VB6 для этого использовал бы CopyMemory, ей пофиг, стринг-не стринг. По дотнетом этим не занимался, но принцип ведь тот же.
22 фев 19, 22:39    [21817690]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
Antonariy, проще:
string name = reader.ReadString();
string capital = reader.ReadString();
int area = reader.ReadInt32();
double population = reader.ReadDouble();
23 фев 19, 10:00    [21817749]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
еще проще:

Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Type Type1
    s As String * 20
    f As Double
    i As Long
End Type

Sub test()
    Dim t1 As Type1
    CopyMemory VarPtr(t1), bytesArr, Len(t1)
End Sub

наверняка в c# тоже так можно, только без CopyMemory.
25 фев 19, 10:25    [21818502]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
Antonariy,
Операции с памятью, указателями в одно время на историческом пути посчитали опасными, и не приветствуются.
25 фев 19, 10:42    [21818509]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1792
>Antonariy, сегодня, 10:25 [21818502]
>наверняка в c# тоже так можно…
<Можно
if(бом.binSerObject(xObj)) { 
. . .
Только для чего это надо? Что будешь делать с сериализацией? Иногда удобнее работать с полями.
25 фев 19, 11:01    [21818522]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
ВМоисеев
>Antonariy, сегодня, 10:25 [21818502]
>наверняка в c# тоже так можно…
<Можно
if(бом.binSerObject(xObj)) { 
. . .
Только для чего это надо? Что будешь делать с сериализацией? Иногда удобнее работать с полями.
Вообще-то тут обратная операция - десериализация в тип.
25 фев 19, 11:09    [21818527]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
Petro123
Antonariy,
Операции с памятью, указателями в одно время на историческом пути посчитали опасными, и не приветствуются.
прям боюсь-боюсь
25 фев 19, 11:10    [21818529]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 37070
Antonariy
Petro123
Antonariy,
Операции с памятью, указателями в одно время на историческом пути посчитали опасными, и не приветствуются.
прям боюсь-боюсь
против ветра, оно знаешь,.....))))
25 фев 19, 11:35    [21818548]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1792
>Antonariy, сегодня, 11:09 [21818527]
>Вообще-то…
<Можно так:
Object xObj=бом.binDeSerObject();

Но с какой целью?
25 фев 19, 11:48    [21818561]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72694
Petro123
Antonariy
пропущено...
прям боюсь-боюсь
против ветра, оно знаешь,.....))))
знаю, галсами.
25 фев 19, 12:19    [21818605]     Ответить | Цитировать Сообщить модератору
 Re: Разбираем массив байтов типа Object  [new]
pation
Member

Откуда: Москва
Сообщений: 4441
mozgen,

TestClass GetTestClass(byte[] barray)
        {
            try
            {
                var t = barray;
                using (var ms = new MemoryStream(t))
                {
                    var bf = new BinaryFormatter();
                    return (TestClass)bf.Deserialize(ms);
                }
            }
            catch
            {
                return new TestClass();
            }
        }

        byte[] GetArray(TestClass tclass)
        {
            using (var ms = new MemoryStream())
            {
                var bf = new BinaryFormatter();
                bf.Serialize(ms, tclass);
                return ms.ToArray();
            }
        }
25 фев 19, 23:47    [21819251]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / WinForms, .Net Framework Ответить