c# - 将 unsigned long long 从 C++ 服务器流式传输到 C# 客户端
问题描述
我相信读者不需要更多代码,但如果您需要查看更多代码,请告诉我。
我需要将字节从 C++ 服务器流式传输到 C# 客户端。我能够读写大多数变量,除非我遇到unsigned long long
需要发送的变量。
由于 C# 中没有 unsigned long long,我尝试将字节读取为两个整数(一次 4 个字节),但它不起作用:即使我消耗 8 个字节,流仍然有要读取的字节。看到评论部分了吗?如果我取消注释它们并执行,它们会被垃圾数据填充,这意味着流中有超过 8 个字节..
有人可以告诉我我哪里出错了吗?C++ 库非常包含,我没有触及它,它适用于大多数变量(和其他应用程序),除了现在和我的情况。如何在 C++ 和 C# 之间发送/读取/存储 unsigned long long?
建议:也许先将 unsigned long long 转换为两个整数,然后发送两个?
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 转换为两个整数:
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));
推荐阅读
- c# - 如何在 EF Core 中级联更新?
- cakephp-3.0 - 第二次单击后分页器无法按预期工作
- assembly - 为什么奇偶校验标志为 1 而个数为奇数
- git - Gemfile.lock 在运行 bundle install 或 jekyll serve 时包含合并冲突
- mysql - 我如何过滤 MYSQL LIMIT 1 中的值
- html - flex元素中的最小宽度设置为最小内容不起作用
- stripe-payments - 使用 Stripe,暂停付款并在订阅开始时确认
- oop - 带有子程序的多态赋值可能导致 Fortran 中的数据损坏
- c# - MVC5 升级后客户 Html 助手的空引用异常
- apache - 如果请求标头格式错误,则不处理 Apache 虚拟主机