2010-08-08 3 views
1

в C++:Преобразование C++ в C#

byte des16[16]; 
.... 
byte *d = des16+8; 

в C#?

byte des16[16]; 
    [0] 207 'Ï' unsigned char 
    [1] 216 'Ø' unsigned char 
    [2] 108 'l' unsigned char 
    [3] 93 ']' unsigned char 
    [4] 249 'ù' unsigned char 
    [5] 249 'ù' unsigned char 
    [6] 100 'd' unsigned char 
    [7] 0 unsigned char 
    [8] 76 'L' unsigned char 
    [9] 50 '2' unsigned char 
    [10] 104 'h' unsigned char 
    [11] 118 'v' unsigned char 
    [12] 104 'h' unsigned char 
    [13] 191 '¿' unsigned char 
    [14] 171 '«' unsigned char 
    [15] 199 'Ç' unsigned char 

after 
byte *d = des16+8; 
d = "L2hvh¿«Ç†¿æ^ òÎL2hvh¿«Ç" 

ответ

2

Я думаю, что это было бы более уместным (хотя это зависит от того, как используется d):

byte[] des16 = new byte[16]; 
IEnumerable<byte> d = des16.Skip(8); 

Используя чистый управляемый код, вы не можете использовать указатели на местах. Так как d принимает указатель на 8-й элемент массива, ближайший аналог будет создавать перечисление des16, пропускающего первые 8 элементов. Если вы просто перебираете элементы, это будет лучший выбор.

Следует также упомянуть, что Skip() является одним из многих методов расширения, доступных для массивов (и других IEnumerable с) в .Net 3.5 (VS2008/VS2010) и до которых я мог предположить только, что вы использовали. Вы не сможете использовать его, если используете .Net 2.0 (VS2003/VS2005).

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

byte[] d = des16.Skip(8).ToArray(); 

Примечание это создает отдельный экземпляр массива, который содержит элементы в des16 за исключением первого 8.

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

[править]

Оказывается, вы работаете со строками с завершающим нулевым в буфере в .Net 2.0, возможно (если Skip() не доступен). Если вам требуется представление строки, вы можете преобразовать его в собственный строковый объект.

byte[] des16 = new byte[16]; 
char[] chararr = Array.ConvertAll(des16, delegate(byte b) { return (char)b; }); //convert to an array of characters 
string str = new String(chararr, 8, chararr-8); //create the string 
+0

Верно, но для этого потребуется некоторое объяснение для C++-go-er. – Dykam

+0

Point принят. Я должен уточнить. –

+0

Спасибо, ребята, но все-таки не он. «System.Array» не содержит определения для «Пропустить». – edv4ld0

9

C# (вообще говоря) не имеет указателей. Может быть, следующее, что вы после:

byte[] des16 = new byte[16]; 
byte byteAtIndex8 = des16[8]; 

Этот код дает элемент с индексом 8.

Если я прочитал ваш код правильно, вы пытаетесь получить адрес элемента с индексом 8 Это, вообще говоря, невозможно с C# (если вы не используете небезопасный код).

+0

Спасибо, ребята, но все же это не так. – edv4ld0

0
byte[] des16 = new byte[16]; 
.... 
byte d = des16[8]; 

Если вы не используете небезопасный код, вы не можете получить указатель.

+0

Спасибо, ребята, но все-таки не он. – edv4ld0

0

@JeffMercado, Спасибо, что открыли мне глаза.

В C++:

byte des16[16]; 
byte *d = des16+8; 

В C#:

byte[] des16 = new byte[16]; 
byte[] b = new byte[8]; 
System.Array.Copy(des16, 8, b, 0, 8); 
0

Указатели в основном получение преобразованы. Мы можем изменить его на коллекцию в C#.

В C++, если вам нужно сменить коллекцию (строку) на байт [] в C#, вы можете выполнить код, как показано ниже.

байт [] toBytes = Encoding.ASCII.GetBytes (somestring);

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