【发布时间】: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