Передача значения бита из C # - PullRequest
3 голосов
/ 22 июня 2011

У меня есть интерфейс C ++, имеющий открытое свойство «P», которое принимает значение бита, например, 5, 6,7 и т. Д. В его документации сказано: «Установите битовую маску группового типа. Бит 5 для« a », Бит 6для 'b' и т. д. "

Я использую этот интерфейс в моем классе C #, а тип этого свойства" P ", показанный в метаданных, -" char "в VS.Net.

Как передать битовое значение 6 и 7 в это свойство из моего кода C #?Обратите внимание, что, как упоминалось выше, значение типа "char" должно передаваться из C # в этот интерфейс C ++, поскольку этот тип показан в метаданных в VS.net

. Пожалуйста, предложите.Код:

Определение интерфейса C ++, как видно из IDE VS.Net -

[SuppressUnmanagedCodeSecurity]
    [Guid("f274179c-6d8a-11d2-90fc-00806fa6792c")]
    [InterfaceType(1)]
    public interface IAccount
    {
        char GroupType { get; set; }
    }

C #:

IAccount objAccount= new AccountClass();
((IAccount)objAccount).GroupType = ??//I need to pass char value here

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Вы можете использовать тип "Enum", который начинается с "байта":

[Flags]
enum BitFlags : byte
{
    One = ( 1 << 0 ),
    Two = ( 1 << 1 ),
    Three = ( 1 << 2 ),
    Four = ( 1 << 3 ),
    Five = ( 1 << 4 ),
    Six = ( 1 << 5 ),
    Seven = ( 1 << 6 ),
    Eight = ( 1 << 7 )
}

void Main()
{
    BitFlags myValue= BitFlags.Six | BitFlags.Seven;

    Console.WriteLine( Convert.ToString( (byte) myValue, 2 ) );
}

Выход: 1100000

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

[SuppressUnmanagedCodeSecurity]
[Guid("f274179c-6d8a-11d2-90fc-00806fa6792c")]
[InterfaceType(1)]
public interface IAccount
{
    byte GroupType { get; set; } // char in native C++ is generally going to be 8 bits, this = C# byte
}

IAccount objAccount= new AccountClass();  

( ( IAccount ) objAccount ).GroupType = ( byte )( BitFlags.Six | BitFlags.Seven );
2 голосов
/ 22 июня 2011

Тип char в C ++ всегда равен 8 битам, что, вероятно, означает, что вы будете использовать byte для представления того же самого в C #.(Это предполагает, что ваша платформа C ++ использует стандартные 8-битные байты, поскольку C ++ char определяется как 1 байт, но «байт» C ++ не обязательно должен быть 8 битами!)

byte b = 0;
b |= 1 << 5;    // set bit 5 (assuming that the bit indices are 0-based)
b |= 1 << 6;    // set bit 6 (assuming that the bit indices are 0-based)

Я не уверен, как бы вы вернули это значение в вашу подпрограмму C ++, если это то, что вам нужно сделать.

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