2014-12-20 4 views
1

У меня есть структура в C++, которая имеет поле char [10].Преобразование C++ char array в строку C#

struct Package 
{ 
    char str[10]; 
}; 

Я преобразовать в массив-структуру полукокса и отправить его и C# приложение через сокет TCP и там преобразовать его обратно в C# структуры.

[StructLayout(LayoutKind.Sequential)] 
public struct Package 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)] 
    public string str; 
}; 

Convertion сделано правильно, и я получаю сообщение, но проблема в том, когда длина сообщения меньше, чем размер массива, и я думаю, что это связано с нулевой терминатор в гр массив символов ++.

Например, если я посылаю "Hello \ 0" из C++ массив символов это что-то вроде:

H ELLO \ 0 \ 0 \ 0 \ 0 \ 0

И когда я его в C# приложение это что-то вроде:

H ELLO I I I I I

И я действительно не знаю, что делать с этим (лично нравится называть) вредную символ «I».

, пожалуйста, помогите мне в этом. Любая помощь приветствуется.

Update:

Я просто бросил-структуру, чтобы символ * и отправить его через сокет;

Package pkg; 
strcpy_s(pkg.str, 'Hello\0'); 

char* bytes = (char*)&pkg; 

send(socket, bytes, sizeof(pkg), NULL); 
+1

Размер вашего массива - 10. Попробуйте ввести 10 символов. У вас нет этого символа «Ì». Итак, вы можете разделить строку. Это одно из решений. –

+0

Ваше решение подходит для 10 символов, но что, если мне нужно иметь все больше и больше персонажей. Howerver ваш ответ напомнил мне, что я могу иметь конец строкового символа, когда я отправляю массив char из C++. Тем не менее я жду большего. – user3530012

+0

Кажется, что в коде C# вы не получаете символ '\ 0'.Или никогда не отправляется вам на C++, но в C++ массив устанавливается «memsetted» на 0x00 для всех символов по умолчанию. – LPs

ответ

4

Я не знаю ни C#, но может быть, вы можете решить проблему таким образом

Package pkg; 
strcpy_s(pkg.str, 10, "Hello"); 

char* bytes = (char*)&pkg; 

send(socket, bytes, sizeof(pkg), NULL); 

Функция strcpy_s принимает размер буфера dst в качестве аргумента, чтобы избежать переполнения (см. here). Я спросил в комментариях о том, как вы его вникнете, потому что это даже не похоже, что это действительно C++.

Завершающее нулевой байт добавляется pkg.str автоматически, а также "Hello" имеет завершающие нулевые байты после o символа, и вы не должны добавить его вручную.

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

+0

Это удивительно сработало. Я не знаю, почему вы получили отрицательный голос. Во всяком случае, какое объяснение? – user3530012

+1

BTW: 'sizeof (pkg)' отлично, если 'pkg.str' - это массив, а не указатель, если это указатель, то это будет' sizeof (pkg) + strlen (pkg.str) + 1', '+ 1' для завершающего нулевого байта. И вам нужно выделить пространство для строки с помощью 'malloc'. –

1

Это то, что я обычно делаю в моих обертках DLL с последовательной линией

 public byte[] RXArray = new byte[length]; 

     byte[] appo = new byte[MsgLength]; 
     Array.ConstrainedCopy(RXArray, NcharsToCopy, appo, 0, MsgLength); 
     string ConvertedToString = System.Text.Encoding.UTF8.GetString(appo); 
1

Вы отправляете SIZEOF массив вместо STRLEN по ул.

Take отмечает, что если вы отправляете с StrLen вам нужно добавить 1 отправить пустое окончание строки