Структура взаимодействия: следует ли сопоставлять шрифт без знака с байтом []? - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть такая структура C ++:

typedef struct _FILE_OP_BLOCK
{                                                                                                                          
    unsigned short fid;     // objective file ID 
    unsigned short offset;  // operating offset
    unsigned char len;      // buffer length(update)
                            // read length(read)        
    unsigned char buff[240];
} FILE_OP_BLOCK;

А теперь я хочу отобразить это в .Net. Хитрость заключается в том, что я должен передать 2-байтовый массив для fid и целое число для len, хотя в C # fid это unsigned short и len это unsigned char

Интересно, правильна ли моя структура (в C #) ниже?

   [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
   public struct File_OP_Block 
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public byte[] fid;

        public ushort offset;

        public byte length;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)]
        public char[] buff;
    }

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Ваше свойство CharSet в атрибуте [DllImport] определенно неверно, вам нужен CharSet.Ansi, чтобы получить маршаллер P / Invoke для преобразования его в char []. Объявите элемент бафа как строку для более легкого использования. Хотя объявление члена fid как байта [] не является неправильным, я действительно не вижу в этом смысла. То, что неуправляемый код копирует в него символ [], является деталью реализации. Таким образом:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct File_OP_Block 
{
    public ushort fid;
    public ushort offset;
    public byte length;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 240)]
    public string buff;
}
0 голосов
/ 09 апреля 2010

Учитывая, что тип данных C ++ short на самом деле составляет два байта, должен работать двухбайтовый массив. Целочисленные размеры в C / C ++ не определены строго, поэтому в стандарте сказано, что short составляет не менее двух байтов.

Тип данных C # char - это 16-битный символ Unicode, поэтому он не соответствует типу данных C ++ char, который является 8-битным типом данных. Либо вам нужен атрибут, чтобы указать, как символы кодируются в байтах, либо использовать байтовый массив.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...