Перевод структуры в набор байтов.
От: Time Россия  
Дата: 20.10.08 17:37
Оценка:
Добрый день.
Как перевести структуру (последовательно поля) в набор байтов, в C++ unmanaged это было просто, разумеется. А имеется ли подобная возможность грамотно делать это в C#? На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно. Аттрибут StructLayout нужен для marshaling и здесь, похоже, мне не поможет.
Заранее благодарен.
... << RSDN@Home 1 alpha 4 rev. 0>>
Re: Перевод структуры в набор байтов.
От: vmpire Россия  
Дата: 20.10.08 17:46
Оценка: 2 (1)
Здравствуйте, Time, Вы писали:

T>Добрый день.

T>Как перевести структуру (последовательно поля) в набор байтов, в C++ unmanaged это было просто, разумеется. А имеется ли подобная возможность грамотно делать это в C#? На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно. Аттрибут StructLayout нужен для marshaling и здесь, похоже, мне не поможет.
T>Заранее благодарен.

Marshal.StructureToPtr

http://www.google.ru/search?q=convert+struct+to+byte+array&amp;sourceid=navclient-ff&amp;ie=UTF-8&amp;rlz=1B3GGGL_enRU228RU228
Перевод структуры в набор байтов.
От: Nikolkos  
Дата: 20.10.08 17:48
Оценка: 7 (3)
#Имя: FAQ.dotnet.rawserialize
T>Как перевести структуру (последовательно поля) в набор байтов
T>На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно.

Можно так:
        public static byte[] RawSerialize<T>(T anything) where T : struct {
            int rawsize = Marshal.SizeOf(anything);
            byte[] rawdata = new byte[rawsize];
            GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned);
            Marshal.StructureToPtr(anything, handle.AddrOfPinnedObject(), false);
            handle.Free();
            return rawdata;
            }


И обратно:

        public static T RawDeserialize<T>(byte[] raw) where T : struct {
            GCHandle handle = GCHandle.Alloc(raw, GCHandleType.Pinned);
            T result = (T)Marshal.PtrToStructure(
                handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();
            return result;
            }
Re: Перевод структуры в набор байтов.
От: akarinsky Россия  
Дата: 20.10.08 19:57
Оценка:
Здравствуйте, Time, Вы писали:

А бинарную сериализацию не пробовали? MemoryStream + BinaryFormater? Или я не так понял проблему?
На опушке за околицей мужики строили коровник.
Работали споро и весело. Получалось х**во.
Re: Перевод структуры в набор байтов.
От: Time Россия  
Дата: 24.10.08 08:02
Оценка:
Здравствуйте, Nikolkos, Вы писали:

N>Можно так:

N>
N>        public static byte[] RawSerialize<T>(T anything) where T : struct {
N>            int rawsize = Marshal.SizeOf(anything);
N>            byte[] rawdata = new byte[rawsize];
N>            GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned);
N>            Marshal.StructureToPtr(anything, handle.AddrOfPinnedObject(), false);
N>            handle.Free();
N>            return rawdata;
N>            }
N>


Как быть когда структура содержит в себе String? Особенно если его надо преобразовать в набор Ansi байтов с длинной в начале.
[MarchalAs(UnamagedType.AnsiBStr)]
public String helloStr;

При таком раскладе
int rawsize = Marshal.SizeOf(anything);

Выдаёт исключение что мол нельзя определить размер структуры.

Спасибо.
Re[2]: Перевод структуры в набор байтов.
От: Nikolkos  
Дата: 24.10.08 09:34
Оценка:
Здравствуйте, Time, Вы писали:


T>Как быть когда структура содержит в себе String? Особенно если его надо преобразовать в набор Ansi байтов с длинной в начале.


Наверное, тогда маршаллеру необходимо указать размер.

[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = SIZE_CONST)]
Re[3]: Перевод структуры в набор байтов.
От: Time Россия  
Дата: 24.10.08 09:49
Оценка:
Здравствуйте, Nikolkos, Вы писали:

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



T>>Как быть когда структура содержит в себе String? Особенно если его надо преобразовать в набор Ansi байтов с длинной в начале.


N>Наверное, тогда маршаллеру необходимо указать размер.


N>
N>[MarshalAs(UnmanagedType.AnsiBStr, SizeConst = SIZE_CONST)]
N>


А если я заранее не знаю размер? Только при создании структуры могу узнать, могу ли я это как то в конструкторе указать?
Re[4]: Перевод структуры в набор байтов.
От: Nikolkos  
Дата: 24.10.08 11:54
Оценка:
T>А если я заранее не знаю размер? Только при создании структуры могу узнать, могу ли я это как то в конструкторе указать?

Как выглядит неуправляемая структура? Интересует тип поля, куда потом маршалится string.

Если это LPSTR, то можно попробовать так:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct YOUR_STRUCT 
{
  [MarshalAs(UnmanagedType.LPStr)]
  public String helloStr;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.