Как это можно сделать в C#?
От: Vyacheslav_M  
Дата: 29.06.02 18:42
Оценка:
Привет всем!

Есть следующая задача:

есть переменная
int var;

структура
private struct s
{
public bool Move;
public int xPos;
public int yPos;
}
s tmp;

и массив байтов
byte[]=new byte[n];

дак вот, надо эту переменную, структуру и массив байтов запихать в другой массив байтов
что бы отправить в socket а на клиентской стороне все это вытащить из того же массива байтов.
Как все это организовать без указателей?
Как упаковать переменые разных типов в один byte[]
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.06.02 19:00
Оценка: 62 (3)
#Имя: FAQ.dotnet.pack2byte[]
Здравствуйте Vyacheslav_M, Вы писали:

VM>Привет всем!


VM>Есть следующая задача:


VM>есть переменная

VM>int var;

VM>структура

VM>private struct s
VM>{
VM> public bool Move;
VM> public int xPos;
VM> public int yPos;
VM>}
VM>s tmp;

VM>и массив байтов

VM>byte[]=new byte[n];

VM>дак вот, надо эту переменную, структуру и массив байтов запихать в другой массив байтов

VM>что бы отправить в socket а на клиентской стороне все это вытащить из того же массива байтов.
VM>Как все это организовать без указателей?

Ну для int и byte[] все просто
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
br.Write(var);
br.Write(bytearr);
socket.Send(ms.Buffer);


Для классов и структур все немножко посложнее
//Твою структурку надо пометить как сериализуемую
[Serializable]
private struct s {
 public bool Move;
 public int xPos;
 public int yPos;
}

...

//Ну а далее выбираешь сериализатор и вперед

MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);

IFormatter formatter = new BinaryFormatter();

br.Write(var);
formatter.Serialize(ms,s);
br.Write(bytearr);
socket.Send(ms.Buffer);
AVK Blog
Re[2]: Как это можно сделать в C#?
От: Vyacheslav_M  
Дата: 29.06.02 19:36
Оценка:
Здравствуйте AndrewVK, Вы писали:


AVK>Ну для int и byte[] все просто

AVK>
AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);
AVK>br.Write(var);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);
AVK>


AVK>Для классов и структур все немножко посложнее

AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>[Serializable]
AVK>private struct s {
AVK> public bool Move;
AVK> public int xPos;
AVK> public int yPos;
AVK>}

AVK>...

AVK>//Ну а далее выбираешь сериализатор и вперед

AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);

AVK>IFormatter formatter = new BinaryFormatter();

AVK>br.Write(var);
AVK>formatter.Serialize(ms,s);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);

AVK>


а как записать в MemoryStream переменную типа перечисление?
Re[3]: Как это можно сделать в C#?
От: TK Лес кывт.рф
Дата: 29.06.02 21:17
Оценка: 3 (1)
Здравствуйте Vyacheslav_M, Вы писали:

VM>Здравствуйте AndrewVK, Вы писали:



VM>а как записать в MemoryStream переменную типа перечисление?


Например через тот-же Formatter...
Или определить базовый тип перечисления (System.Enum.GetUnderlyingType()) и записать его.
Или преобразовать enum в строку и записать ее
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как это можно сделать в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.06.02 05:05
Оценка:
Здравствуйте Vyacheslav_M, Вы писали:

VM>а как записать в MemoryStream переменную типа перечисление?

А перечисление это на самом деле целое.

An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong

так что можешь явно указать подлежащий для перечисления тип.

Ну а потом как обычно пишешь BinaryWriter
AVK Blog
Re[2]: Как это можно сделать в C#?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.06.02 17:19
Оценка:
Здравствуйте AndrewVK, Вы писали:

А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Как это можно сделать в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.06.02 18:35
Оценка:
Здравствуйте VladD2, Вы писали:

VD>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...

Может быть. А может и нет. Он же как обычно не сказал подробно что хочет. Может там вобще ничего пересылать не нужно. А может структуру в каком то особенном формате пересылать надо. Тут можно только гадать.
AVK Blog
Re[3]: Как это можно сделать в C#?
От: Vyacheslav_M  
Дата: 04.07.02 03:10
Оценка:
Здравствуйте VladD2, Вы писали:

VD>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...


А что это такое и с чем его едят???
Re[4]: Как это можно сделать в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.07.02 05:21
Оценка: -1
Здравствуйте Vyacheslav_M, Вы писали:

VM>Здравствуйте VladD2, Вы писали:


VD>>А может человеку лучше о ремоутенге почитать? Все же вручную с сокетами это мазахизм, тем более что имеется такой развитой механизм как ремоутинг...


VM>А что это такое и с чем его едят???


Это механизм взаимодействия удаленных объектов.
AVK Blog
Re[2]: пара вопросов в тему
От: Ed.ward Россия  
Дата: 15.06.03 01:00
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Для классов и структур все немножко посложнее

AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>[Serializable]
AVK>private struct s {
AVK> public bool Move;
AVK> public int xPos;
AVK> public int yPos;
AVK>}

AVK>...

AVK>//Ну а далее выбираешь сериализатор и вперед

AVK>MemoryStream ms = new MemoryStream();
AVK>BinaryWriter bw = new BinaryWriter(ms);

AVK>IFormatter formatter = new BinaryFormatter();

AVK>br.Write(var);
AVK>formatter.Serialize(ms,s);
AVK>br.Write(bytearr);
AVK>socket.Send(ms.Buffer);

AVK>


А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.

И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?

Ed.ward
Re[3]: пара вопросов в тему
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.06.03 06:42
Оценка: 2 (1)
Здравствуйте, Ed.ward, Вы писали:

EW>И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?


Умеет, если соотв. ченнел есть.
... << RSDN@Home 1.1 alpha 1 (np: тихо) >>
AVK Blog
Re[3]: пара вопросов в тему
От: TK Лес кывт.рф
Дата: 15.06.03 09:07
Оценка: 14 (3)
Hello, "Ed.ward"
>
> А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.
>

Надо имя структуры по короче сделать. Или можно использовать яву классы — там примерно в 1.5 раза компактнее

using System;

namespace SerializationTest
{
 [Serializable]
 public struct CSStruct 
 {
  public int csValue;
 }

 public struct JSStruct : java.io.Serializable
 {
  public int jsValue;
 }

 class TestConsole
 {
  [STAThread]
  static void Main(string[] args)
  {
   SerializeCS();
   SerializeJS();
  }

  static void SerializeJS()
  {
   java.io.ByteArrayOutputStream stm;
   java.io.ObjectOutputStream objectStm;

   stm = new java.io.ByteArrayOutputStream();
   objectStm = new java.io.ObjectOutputStream(stm);

   objectStm.writeObject(new JSStruct());

   Console.WriteLine("Java Serialization (SimpleStruct): {0}", stm.size());

   stm = new java.io.ByteArrayOutputStream();
   objectStm = new java.io.ObjectOutputStream(stm);
   
   java.util.ArrayList list = new java.util.ArrayList();

   for (int i = 0 ; i < 10 ; ++i) {
    list.add(new JSStruct());
   }

   objectStm.writeObject(list);
   Console.WriteLine("Java Serialization (ArrayList): {0}", stm.size());
  }

  static void SerializeCS()
  {
   System.IO.MemoryStream stm;
   
   using (stm = new System.IO.MemoryStream())
   {
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

    formatter.Serialize(stm, new CSStruct());
    Console.WriteLine(".NET Serialization (SimpleStruct): {0}", stm.Length);
   }

   using (stm = new System.IO.MemoryStream())
   {
    System.Collections.ArrayList list = new System.Collections.ArrayList();
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

    for (int i = 0 ; i < 10 ; ++i) {
     list.Add(new CSStruct());
    }

    formatter.Serialize(stm, list);
    Console.WriteLine(".NET Serialization (ArrayList): {0}", stm.Length);
   }
  }
 }
}


> И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?

>

NamedPipes, MSMQ, MSNMessenger, Jabber, SMTP, HTTP, CORBA, MemoryMappedFiles и еще что-нибудь...
Искать: BidirectionalTCPChannel.zip, jabberchannel.zip, MSMQChannel_src.zip, NamedPipeChannel.zip, smtpchannel.zip
Posted via RSDN NNTP Server 1.6 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: пара вопросов в тему
От: Ed.ward Россия  
Дата: 16.06.03 08:29
Оценка:
Здравствуйте, TK, Вы писали:


TK>Надо имя структуры по короче сделать. Или можно использовать яву классы — там примерно в 1.5 раза компактнее


Короче некуда "AddLines"...

Ed.ward
Re[2]: Как это можно сделать в C#?
От: mihailik Украина  
Дата: 17.06.03 15:28
Оценка: 2 (1)
AVK>Для классов и структур все немножко посложнее
AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>...

AVK>//Ну а далее выбираешь сериализатор и вперед
AVK>


Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.
... << RSDN@Home 1.0 beta 7a >>
Re[3]: пара вопросов в тему
От: Vadim B  
Дата: 17.06.03 15:47
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.


Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().

EW>И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?


Можно к чему угодно привязать, но возни будет очень много. Инго Раммер в своей книге, например, приводит реализацию ремоутинга через е-мэйлы (при вызове функции серверу посылается е-мэйл, он отвечает е-мэйлом с результатом).
Re[4]: пара вопросов в тему
От: TK Лес кывт.рф
Дата: 17.06.03 18:44
Оценка:
Hello, "Vadim B"

> EW>И еще вопрос про Remoting, он только по TCP/IP умеет ходить, или можно к другим протоколам привязать?

>
> Можно к чему угодно привязать, но возни будет очень много. Инго Раммер в своей книге, например, приводит реализацию ремоутинга через е-мэйлы (при вызове функции серверу посылается е-мэйл, он отвечает е-мэйлом с результатом).

Не он первый это придумал. В Technology Preview для .NET Framework и не такое было
Posted via RSDN NNTP Server 1.6 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: пара вопросов в тему
От: Ed.ward Россия  
Дата: 18.06.03 07:06
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Ed.ward, Вы писали:


EW>А по другому (но стандартными средствами) никак? А то у меня структура с единственным Int32 полем в сеарилизованном состоянии заняла 165! байт.


VB>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().


Мне надо пересылать кучу пакетиков туда-сюда.
Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.

Пишу вот свой теперь преобразователь...

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[3]: Как это можно сделать в C#?
От: Ed.ward Россия  
Дата: 18.06.03 07:10
Оценка:
Здравствуйте, mihailik, Вы писали:

AVK>Для классов и структур все немножко посложнее

AVK>
AVK>//Твою структурку надо пометить как сериализуемую
AVK>...

AVK>//Ну а далее выбираешь сериализатор и вперед
AVK>


M>Можно быстрее и дешевле, используя System.Runtime.InteropServices.Marshal и его методы StructureToPtr и Copy.


Хм...
Я так понял, что мне под это дело нужно будет блок неупрявляемого кода писать?

К сожалению мне это не очень подходит...

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[5]: пара вопросов в тему
От: Vadim B  
Дата: 18.06.03 07:22
Оценка:
Здравствуйте, Ed.ward, Вы писали:

VB>>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().


EW>Мне надо пересылать кучу пакетиков туда-сюда.

EW>Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.

EW>Пишу вот свой теперь преобразователь...


Аналогично. Мне нужно было передавать и принимать данные, подстраиваясь под существующий протокол, так что пришлось написать преобразователь, на нижнем уровне основанный на System.BitConverter, о котором я говорил выше.
Binary(Writer/Reader)
От: Ed.ward Россия  
Дата: 18.06.03 07:24
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Здравствуйте, Ed.ward, Вы писали:


VB>>Если тебе единственное поле надо переслать, или если надо переслать в виде потока байтов определенного формата (чтобы другая программа не на дотнете понимала, например), то посмотри в сторону System.BitConverter.GetBytes(). Обратное преобразование — System.BitConverter.ToInt32().


EW>Мне надо пересылать кучу пакетиков туда-сюда.

EW>Для простоты (как я это делал в С++) я структуру этих пакетиков описал структурами, а потом обнаружил, что сеарилизация создаст мне неплохой трафик, а другого способа представить структуру как массив байт я не нашел.

EW>Пишу вот свой теперь преобразователь...


VB>Аналогично. Мне нужно было передавать и принимать данные, подстраиваясь под существующий протокол, так что пришлось написать преобразователь, на нижнем уровне основанный на System.BitConverter, о котором я говорил выше.


Угу
Только, по-моему, проще опираться сразу на Binary(Writer/Reader)

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.