Полагаю, читателям больше не понадобится код, но если вам нужно больше кода, пожалуйста, дайте мне знать.
Мне нужно направить байты с сервера C ++ на клиент C #. Я могу писать и читать большинство переменных, за исключением случаев, когда я получаю unsigned long long
, который нужно отправить.
Поскольку в C # нет длинных без знака, я попытался прочитать байты как два целых числа (4 байта за раз), но это не работает: поток все еще имеет байты для чтения, даже когда я использую 8 байт. Видите прокомментированную часть? Если я откомментирую их и выполню, они заполнятся ненужными данными, это означает, что в потоке было более 8 байт.
Может кто-нибудь сказать мне, где я иду не так? Библиотека C ++ довольно содержательна, и я ее не трогал, и она работает с большинством переменных (и других приложений), кроме как сейчас и в моем случае. Как отправить / прочитать / сохранить длинный без знака между C ++ и C #?
Предложение: Может быть сначала преобразовать длинный без знака длинный в два, а затем отправить два?
C ++:
stmOstream& MyClass :: SendToClient( stmOstream& aStream ) const
{
unsigned long long DoomedVariable;
aStream << DoomedVariable;
return aStream;
}
C #:
NetworkStream myStream;
mSocket = new TcpClient();
await mSocket.ConnectAsync(IPAddress.Parse("127.0.0.1"), 11111);
myStream= mSocket.GetStream();
private async Task ReadBytes( byte[] InBuffer, int SizeNeeded)
{
int ReadyBytes = await myStream.ReadAsync( readBuffer, 0, SizeNeeded);
while ( ReadyBytes != SizeNeeded)
{
lBytesReady += await myStream.ReadAsync( InBuffer, ReadyBytes , SizeNeeded- ReadyBytes );
}
}
private async Task<int> ReadReply( )
{
byte[] lReadBuffer = new byte[ 2048 ];
await ReadBytes( lReadBuffer, 4 );
int FirstHalf = BitConverter.ToInt32( lReadBuffer, 0 );
await ReadBytes( lReadBuffer, 4 );
int SecondHalf = BitConverter.ToInt32( lReadBuffer, 0 );
//await ReadBytes( lReadBuffer, 4 );
//int JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
//await ReadBytes( lReadBuffer, 4 );
//JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
//await ReadBytes( lReadBuffer, 4 );
//JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
//await ReadBytes( lReadBuffer, 4 );
//JunkData = BitConverter.ToInt32( lReadBuffer, 0 );
}