将 unsigned long long 从 C++ 服务器流式传输到 C# 客户端
Stream unsigned long long from C++ server to C# client
我相信读者不需要更多代码,但如果您需要查看更多代码,请告诉我。
我需要将字节从 C++ 服务器流式传输到 C# 客户端。我能够写入和读取大多数变量,除非我遇到需要发送的 unsigned long long
。
由于 C# 中没有 unsigned long long,我尝试将字节读取为两个整数(一次 4 个字节),但它不起作用:流仍然有字节要读取,即使我消耗 8 个字节。看到评论部分了吗?如果我取消对它们的注释并执行,它们会填充垃圾数据,这意味着流中有超过 8 个字节..
有人能告诉我哪里错了吗? C++ 库非常包含,我没有接触它,它适用于大多数变量(和其他应用程序),除了现在和我的情况。如何 send/read/store 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 );
}
将 64 位 long long 转换为两个 int:
unsigned int firstHalf = DoomedVariable & 0xFFFFFFFF; //first four bytes
unsigned int secondHalf = (DoomedVariable >> 32) & 0xFFFFFFFF; //last four bytes
在 c++ 中,long long 是 "at least" 64 位,因此可能值得看看它在您的平台上有多大
printf("%d", sizeof(unsigned long long));
我相信读者不需要更多代码,但如果您需要查看更多代码,请告诉我。
我需要将字节从 C++ 服务器流式传输到 C# 客户端。我能够写入和读取大多数变量,除非我遇到需要发送的 unsigned long long
。
由于 C# 中没有 unsigned long long,我尝试将字节读取为两个整数(一次 4 个字节),但它不起作用:流仍然有字节要读取,即使我消耗 8 个字节。看到评论部分了吗?如果我取消对它们的注释并执行,它们会填充垃圾数据,这意味着流中有超过 8 个字节..
有人能告诉我哪里错了吗? C++ 库非常包含,我没有接触它,它适用于大多数变量(和其他应用程序),除了现在和我的情况。如何 send/read/store 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 );
}
将 64 位 long long 转换为两个 int:
unsigned int firstHalf = DoomedVariable & 0xFFFFFFFF; //first four bytes
unsigned int secondHalf = (DoomedVariable >> 32) & 0xFFFFFFFF; //last four bytes
在 c++ 中,long long 是 "at least" 64 位,因此可能值得看看它在您的平台上有多大
printf("%d", sizeof(unsigned long long));