Рейтинг@Mail.ru
Структуру в массив байт и обратно StructToBytes - Форум atms
Главная Мой профиль Регистрация Выход Вход
- Четверг, 08:24:1
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Unity3D » C# Unity Справочник (Для чайников) » Структуру в массив байт и обратно StructToBytes (Можно использовать для обмена пакетами с разным типам данных)
Структуру в массив байт и обратно StructToBytes
ПользовательДата: Пятница, 21 Августа 2015, 13:05 | Сообщение # 1
Некто
Группа: Обычный пользователь
Сообщений: 141
Репутация: 19
Статус: Нет на форме
Код
using System.Runtime.InteropServices;//что бы работал StructLayout

Код
static byte[] StructToBytes(object str)
{
int size = Marshal.SizeOf(str); byte[] arr = new byte;
IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr);
return arr;
}


--- и обратно ---
Код
public static void BytesToStruct<T>(byte[] bytearray, ref T obj)
{
int len = Marshal.SizeOf(obj);
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(bytearray, 0, i, len);
obj = (T)Marshal.PtrToStructure(i, typeof(T));
Marshal.FreeHGlobal(i);
}

Как использовать?
1) Создадим структуру, путь будет message

Код
[StructLayout(LayoutKind.Sequential, Pack=1)] //упакуем что бы меньше занимало памяти
struct message
{
public byte a;
public int b;
}


2) Создадим переменную типа message и преобразуем в массив байт

Код
message msg; //создаем переменную msg, типа message
msg.id = 1;    //запишем в нее значения
msg.b = 192;
byte[] arr = new byte[Marshal.SizeOf(msg)]; //создадим массив байт по размеру структуры
arr = StructToBytes(msg); //запишем в массив байт arr содержимое структуры, готово!


3) А теперь переведем массив байт arr обратно в структуру

Код
message msg2 = default(message); //создаем переменную msg2, типа message и запишем ей все значения по дефолту(так надо иначе ошибка)
BytesToStruct(arr,ref msg2); //переводим массив байт в переменную msg2
Debug.Log(msg2.b); //выведем значение b из msg2 в дебаг и убедимся что там находится число 192.


Да хранит вас Ctrl+S.
Да убережет вас Alt+F4 от порнобанера.
Админь...
 
Форум » Unity3D » C# Unity Справочник (Для чайников) » Структуру в массив байт и обратно StructToBytes (Можно использовать для обмена пакетами с разным типам данных)
  • Страница 1 из 1
  • 1
Поиск:

atms 2009 © 2024