Выделение массивов символов в Struct для Windows CE - PullRequest
2 голосов
/ 20 марта 2011

Как можно упорядочить массивы символов в следующем определении структуры? в .Net CompactFramework (для Windows CE)

// Структура запроса на транзакцию

typedef struct _VXN_REQUEST
{

    char        DID [33]; 
    char        MID [33]; 
    char        TID [33];  
    char        ClientRef [33]; 
    char        Payload [8192];
    ULONG       PayloadLength;
} VXN_REQUEST, *LPVXN_REQUEST;

Я пытался это маршалировать, но это не сработало

        [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
        public struct VXN_REQUEST
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
            public string DID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
            public string MID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
            public string TID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
            public string ClientRef;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
            public string Payload;
            public uint PayloadLength;

        }

Также пробовал вот так, но ни один из них не работает, нативный код воспринимает его как один символ.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct VXN_REQUEST
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]

    public char[] DID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]

    public char[] MID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]

    public char[] TID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]

    public char[] ClientRef;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]

    public char[] Payload;
    public uint PayloadLength;
}

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Измените вашу декларацию P / Invoke на байт [] вместо структуры, затем определите ее так:

public class VXN_REQUEST 
{
    private byte[] m_data;

    public const int Size = 8328;

    public VXN_REQUEST()
    {
        m_data = new byte[Size];
    }

    public static implicit operator byte[](VXN_REQUEST req)
    {
        return req.m_data;
    }

    public string DID
    {
        get { return Encoding.ASCII.GetString(m_data, 0, 33).Trim('\0'); }
        set 
        { 
            // TODO: verify that 'value' isn't too long
            // first clear the contents
            var empty = new byte[33];
            Buffer.BlockCopy(empty, 0, m_data, 0, empty.Length);
            // copy data
            Encoding.ASCII.GetBytes(value).CopyTo(m_data, 0); 
        }
    }

    public string MID
    {
        get { return Encoding.ASCII.GetString(m_data, 33, 33).Trim('\0'); }
    }

    public string TID
    {
        get { return Encoding.ASCII.GetString(m_data, 66, 33).Trim('\0'); }
    }

    public string ClientRef
    {
        get { return Encoding.ASCII.GetString(m_data, 99, 33).Trim('\0'); }
    }

    public string Payload
    {
        get { return Encoding.ASCII.GetString(m_data, 132, PayloadLength).Trim('\0'); }
    }

    public int PayloadLength
    {
        get { return BitConverter.ToInt32(m_data, 8324); }
    }
}

И для записи, длина в 33 символа кажется мне действительно странной.

1 голос
/ 21 марта 2011

.NET char занимает два байта, он хранит код Unicode, закодированный в utf-16.Используйте байт вместо char в объявлении.Используйте Encoding.ASCII.GetBytes () для заполнения байта [], если вы действительно хотите, чтобы эти поля были строками.

...