Задать вопрос
@DeboshiR
Свободу разработчикам!!!

Как объединить и разъединить byte[]?

Одна программа отправляет по сети поток byte[] в котором находится текст и картинка. Вопрос заключается в следующем: как правильно объединить текст и картинку в этот byte[] чтоб их потом можно было вычленить? Наверно подойдёт вариант, скажем, записи в первые 1024 байта текста в остальные 1024 картинки? Но как это правильно реализовать?
  • Вопрос задан
  • 1099 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Neuroware
@Neuroware
Программист в свободное от работы время
Согласен с Александр Зайцев, однозначно сериализация. ниже пример, честно с.изженный отсюда
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO; 
 
namespace Serialization
{
    [Serializable]
    class MSG
    {
        public int type;
        public string message;
        
        public MSG(int i, string s)
        {
            type = i;
            message = s;
        }
    }
    
    class Program
    {
        public static byte[] Serialization (MSG obj)
        {
            BinaryFormatter formatter = new BinaryFormatter();          
            MemoryStream stream = new MemoryStream();           
            formatter.Serialize(stream, obj);           
            byte[] msg = stream.ToArray();
            return msg;
        }
        
        public static MSG DeSerialization (byte[] serializedAsBytes)
        {
            MemoryStream stream = new MemoryStream();           
            BinaryFormatter formatter = new BinaryFormatter();          
            stream.Write(serializedAsBytes, 0, serializedAsBytes.Length);           
            stream.Seek(0, SeekOrigin.Begin);           
            return (MSG)formatter.Deserialize(stream); 
        }
        
        public static void Main(string[] args)
        {
            MSG msg = new MSG(1,"Я не сериализован");
            byte[] buf = new byte[1024];
            
            buf = Serialization(msg);
            
            Console.WriteLine("До сериализации  " + buf);
            
            MSG msg1 = new MSG(2,"Текст");
            msg1 = DeSerialization (buf);
            Console.WriteLine("После сериализации  " + msg1.message);
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Я бы сделал это при помощи сериализации (класс BinaryFormatter).

Создаём класс, который содержит картинку и текст, пихаем туда твою картинку и текст, сериализуем всё это при помощи BinaryFormatter.Serialize( ) в MemoryStream, получаем из него массив байт.

При получении массива байт, создаём MemoryStream из массива, десериализуем из него при помощи BinaryFormatter.Deserialize( ) - получаем класс с нашей картинкой и текстом
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Первые 4 байта размер картинки, потом все байты картинки, затем 4 байта размер текста, затем байты текста
Ответ написан
Комментировать
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
Строки можно писать нуль-терминированные. Сначала
System.Text.Encoding.Unicode.GetBytes(str + "\0");
после Array.CopyTo, а обратное преобразование -
do {/*сейчас текст*/} while (str[i] != 0);
/*теперь остальное*/

Не забываем про кодировку. А чтобы было красиво, стоит послушаться Александр Зайцев и реализовать ISerializable.
Ответ написан
@DeboshiR Автор вопроса
Свободу разработчикам!!!
Немного подправленные исходники от Виталий Пухов:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Serialization
{
    [Serializable]
    class MSG
    {
        public int type;
        public string message;

        public MSG(int i, string s)
        {
            type = i;
            message = s;
        }
    }

    class Program
    {
        public static byte[] Serialization(MSG obj)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            formatter.Serialize(stream, obj);
            byte[] msg = stream.ToArray();
            return msg;
        }

        public static MSG DeSerialization(byte[] serializedAsBytes)
        {
            MemoryStream stream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            stream.Write(serializedAsBytes, 0, serializedAsBytes.Length);
            stream.Seek(0, SeekOrigin.Begin);
            return (MSG)formatter.Deserialize(stream);
        }

        public static void Main(string[] args)
        {
            MSG msg = new MSG(65456541, "Я нasdsadsadsdafvdsafvbе сериализован");
            MSG msg1;
            byte[] buf = new byte[1024];

            buf = Serialization(msg);
            Console.WriteLine("До сериализации  " + msg.type + "|" + msg.message);

            msg1 = DeSerialization(buf);
            Console.WriteLine("После сериализации  " + msg1.type + "|" + msg1.message);

            Console.ReadKey(true);
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы