2014-01-07 3 views
-2

Я маршалинг родной код выигрыша 32 из-за смешения value-type членов и reference-type членов в структурах внутри объединений, я преобразовал все мои ссылочные типы в байт и обратился к размеру из них с помощью fielOffset. Теперь я хочу получить доступ к значению одного из этих членов, и я не знаю, как это сделать. нижеприведенные коды являются образцами.Чтение массива символов из байт в неуправляемой памяти

здесь C++ структура

typedef struct 
    {  
    int Port; 
    char SubsId[FIELD_SIZE_SUBS_ID+1]; 
    char Options[FIELD_SIZE_OPTIONS+1]; 
    } MMTPRcnxReq; 

здесь C# эквивалент

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)] 
public struct MMTPRcnxReq 
{ 
    [FieldOffset(0)] 
    public Int32 Port; 

    [FieldOffset(4)] 
    public byte SubsId; 

    [FieldOffset(4 + FIELD_SIZE_SUBS_ID + 1)] 
    public byte Options; 
} 

теперь я хочу, чтобы получить доступ к значению Subid, который на самом деле является массив символов и exmaple сравнить его строка в моем управляемом коде, , как показано ниже

if(mMTPRcnxReq.SubsId == "12345") // WRONG 

хау Я могу это сделать?

+2

Странный код. Вам вообще не нужно 'FieldOffset', используйте' [MarshalAs (UnmanagedType.ByValArray, SizeConst = FIELD_SIZE_SUBS_ID + 1)] public Byte [] SubsId; ', то же самое для параметров. –

+0

Я смущен вашим вопросом, сначала 'char' имеет более одного байта, а строка имеет не менее 1' char'. 'SubsId' не может быть массивом символов, если он объявлен как' byte'. – Jodrell

+0

@AlexFarber, я не хочу использовать ссылочный тип вообще. – Parid0kht

ответ

2

Возможно, вам понадобится unsafe с фиксированными буферами.

unsafe struct MMTPRcnxReq 
{ 
    public int Port; 
    public fixed byte SubsId[FIELD_SIZE_SUBS_ID+1]; 
    public fixed byte Options[FIELD_SIZE_OPTIONS+1]; 
} 

Фиксированный размер буфера является типом значения, и это позволит вам поставить одну из этих структур внутри # союза FieldOffset(0) C.

Прочитайте строки, как это:

string SubsId; 
unsafe 
{ 
    fixed (byte* ptr = req.SubsId) 
    { 
     // I presume that req.SubsId is null-terminated 
     SubsId = Marshal.PtrToStringAnsi((IntPtr)ptr); 
    } 
} 

Вы, вероятно, писать вспомогательные методы получения и установки на структуры, возможно, в качестве свойств, для управления буферов фиксированного размера.

Смежные вопросы