【问题标题】:Stream unsigned long long from C++ server to C# client将 unsigned long long 从 C++ 服务器流式传输到 C# 客户端
【发布时间】:2019-05-24 13:52:41
【问题描述】:

我相信读者不需要更多代码,但如果您需要查看更多代码,请告诉我。

我需要将字节从 C++ 服务器流式传输到 C# 客户端。我能够读写大多数变量,除非遇到需要发送的unsigned long long

由于 C# 中没有 unsigned long long,我尝试将字节读取为两个整数(一次 4 个字节),但它不起作用:即使我消耗了 8 个字节,流仍然有要读取的字节字节。看到评论部分了吗?如果我取消注释它们并执行,它们会被垃圾数据填充,这意味着流中有超过 8 个字节..

谁能告诉我哪里出错了? C++ 库非常包含,我没有触及它,它适用于大多数变量(和其他应用程序),除了现在和我的情况。如何在 C++ 和 C# 之间发送/读取/存储 unsigned long long?

建议:可以先将 unsigned long long 转换为两个 int,然后再发送两个?

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 );
}

【问题讨论】:

  • 也许先将 long long 转换为两个 int,然后再发送两个?如何将 long long 转换为两个 int?
  • 您是否有任何理由将 unsigned long long 拆分为整数,而不是仅仅将其读取为 ulong (这正是您正在寻找的 int64)在 C# 方面?
  • @Milster 我试过了,但我没有从服务器发送相同的值。我认为因为 ulong 是 4 个字节,但 unsigned long long 是 8 个字节
  • 这很奇怪。 ulong 是一个 64 位变量(8 个字节),就像 C++ 中的 unsigned long long 一样。但是,unsigned long long 可能比这更大,这取决于编译代码的平台,尽管很少见。

标签: c# c++ sockets stream streaming


【解决方案1】:

将 64 位长的 long 转换为两个整数:

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

在 c++ 中,long long “至少”是 64 位,因此可能值得看看它在您的平台上有多大

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

【讨论】:

  • 您好,谢谢您的回答。当你说first half时,你是指最左边的32位吗?
  • 另外,您能否展示如何将两个整数重新组合在一起以在 C# 端生成一个 ulong
  • 当我说前半部分时,我指的是最低有效位,即右半部分。在客户端,您可以像(ulong)(((ulong)SecondHalf &lt;&lt; 32) | FirstHalf) 一样将两个变量重新拼接在一起(您应该能够只使用您拥有的代码来获取两半)您可能需要根据数据的传递方式来反转字节顺序到服务器 ((ulong)(((ulong)FirstHalf&lt;&lt; 32) | SecondHalf))
  • 希望对您有所帮助:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2015-08-22
  • 2021-12-16
相关资源
最近更新 更多