Поток unsigned long long с сервера C ++ на клиент C # - PullRequest
0 голосов
/ 24 мая 2019

Полагаю, читателям больше не понадобится код, но если вам нужно больше кода, пожалуйста, дайте мне знать.

Мне нужно направить байты с сервера 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 );
}

1 Ответ

1 голос
/ 24 мая 2019

Чтобы преобразовать длинную 64-битную длину в два целых:

unsigned int firstHalf = DoomedVariable & 0xFFFFFFFF; //first four bytes
unsigned int secondHalf = (DoomedVariable >> 32) & 0xFFFFFFFF; //last four bytes

В c ++ длинная длина составляет не менее 64 бит, поэтому, возможно, стоит посмотреть, насколько она велика на вашей платформе с

printf("%d", sizeof(unsigned long long));
...