Где вы собираетесь использовать эту структуру - я полагаю, для вызова некоторого API стиля Win32. Таким образом, правильная реализация будет зависеть от того, что ищет этот API. Например, если он ожидает символы ASCII (char), вам нужно использовать ASCIIEncoding . Если ожидаются символы Unicode (WCHAR), тогда вы должны использовать UnicodeEncoding . Я бы посоветовал вам поделиться этим API, чтобы получить больше полезных ответов.
РЕДАКТИРОВАТЬ : Я не уверен, что вы вызываете какую-либо неуправляемую DLL или как вы определили структуру вашей структуры, но может пригодиться следующая информация:
Если идея состоит в том, чтобы написать содержимое структуры там, где вы предполагаете, что оно имеет длину 40 байтов (три встроенных массива по 32, 4 и 4 байта), тогда это не будет работать "как есть" в .NET. Это связано с тем, что массив - это ссылочные типы (указатели на память где-то еще), и .NET может выбирать смещение поля, чтобы выровнять границы слов, поэтому решение состоит в том, чтобы использовать атрибуты для маркировки этого структурного макета. Например,
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ascii)]
public struct mystruc
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
[FieldOffset(0x00)]
public byte[] install_name; // size limit 32 bytes
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
[FieldOffset(0x33)]
public byte[] install_id; // size limit 4 bytes
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
[FieldOffset(0x37)]
public byte[] model_name; // size limit 4 bytes
}
Здесь мы говорим, что мы будем явно планировать структуру (используя смещение поля) и затем предоставим информацию для каждого поля. Эта структура, вероятно, будет эквивалентна тому, что вы хотите. Или вы должны играть с этими атрибутами в соответствии с вашими требованиями.