Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 08:12   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Проблема union.

Здравствуйте. Возникла непонятная проблема с переводом структур из union С++ в шарп.

Вот с++ код
Код:
typedef struct {
  byte_t  abtAtqa[2];
  byte_t  btSak;
  size_t  szUidLen;
  byte_t  abtUid[10];
  size_t  szAtsLen;
  byte_t  abtAts[36];
} nfc_iso14443a_info_t;

typedef struct {
  size_t  szLen;
  byte_t  btResCode;
  byte_t  abtId[8];
  byte_t  abtPad[8];
  byte_t  abtSysCode[2];
} nfc_felica_info_t;

typedef struct {
  byte_t  abtAtqb[12];
  byte_t  abtId[4];
  byte_t  btParam1;
  byte_t  btParam2;
  byte_t  btParam3;
  byte_t  btParam4;
  byte_t  btCid;
  size_t  szInfLen;
  byte_t  abtInf[64];
} nfc_iso14443b_info_t;

typedef struct {
  byte_t  btSensRes[2];
  byte_t  btId[4];
} nfc_jewel_info_t;

typedef struct {
  byte_t  NFCID3i[10];
  byte_t  btDID;
  byte_t  btBSt;
  byte_t  btBRt;
} nfc_dep_info_t;

typedef union {
  nfc_iso14443a_info_t nai;
  nfc_felica_info_t nfi;
  nfc_iso14443b_info_t nbi;
  nfc_jewel_info_t nji;
  nfc_dep_info_t ndi;
} nfc_target_info_t;

вот как переписал в шарп

Код:
 [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct nfc_iso14443a_info_t
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] abtAtqa;
            public byte btSak;
            public UInt32 szUidLen;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public byte[] abtUid;
            public UInt32 szAtsLen;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
            public byte[] abtAts;
        } ;

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct nfc_felica_info_t
        {
            UInt32 szLen;
            public byte btResCode;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public byte[] abtId;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public byte[] abtPad;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] abtSysCode;
        } ;

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct nfc_iso14443b_info_t
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
            public byte[] abtAtqb;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] abtId;
            public byte btParam1;
            public byte btParam2;
            public byte btParam3;
            public byte btParam4;
            public byte btCid;
            public UInt32 szInfLen;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
            public byte[] abtInf;
        } ;

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct nfc_jewel_info_t
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] btSensRes;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public byte[] btId;
        } ;

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct nfc_dep_info_t
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public byte[] NFCID3i;
            public byte btDID;
            public byte btBSt;
            public byte btBRt;
        } ;


        [StructLayout(LayoutKind.Explicit, Pack = 1)]
        struct nfc_target_info_t
        {
            [FieldOffset(0)]
            public nfc_iso14443a_info_t nai;

            [FieldOffset(0)]
            public nfc_felica_info_t nfi;

            [FieldOffset(0)]
            public nfc_iso14443b_info_t nbi;

            [FieldOffset(0)]
            public nfc_jewel_info_t nji;

            [FieldOffset(0)]
            public nfc_dep_info_t ndi;
        } ;

при попытке вызвать код
Код:
nfc_target_info_t ti = new nfc_target_info_t();
получаю ошибку:

Цитата:
Не удалось загрузить тип "nfc_target_info_t" из сборки "CardTester, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", так как он содержит поле объекта со смещением 0, которое неверно выровнено или перекрыто полем, не представляющим объект.
Что не так?? Баловался по всякому, и задавал параметр Size = кратному 8 размеру структур. Но он дает ошибку и все тут.
Может кто знает что тут не так?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось Stilet; 18.09.2015 в 08:27.
WorldMaster вне форума Ответить с цитированием
Старый 18.09.2015, 10:28   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ошибочка..

Цитата:
100500 букаф
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Select into и union all NuraPROG БД в Delphi 4 15.10.2013 12:40
Linq Union ts-alan C# (си шарп) 1 27.03.2013 15:20
Union mansp Общие вопросы C/C++ 6 30.11.2010 21:48
UNION - подскажите Yurk@ БД в Delphi 1 06.08.2008 09:18
Union NeiL Общие вопросы C/C++ 1 30.05.2008 23:45