通过网络传输int
transfer int over network
我是网络编程的新手,所以我有一个问题:在我的情况下,在C++和C#之间发送一个整数(假设为16位整数,因为32有"endianes"问题)安全吗?如何发送?
在我的程序中,我将int转换为char(我知道is低于255)并发送它。然而,我想发送32 int。我尝试使用协议缓冲区来执行此操作。我在C++中使用了WriteVarint32,在C#中使用了ProtoReader.ReadUInt32,但没有成功(C#中除外)。我读了这篇文章后觉得它会起作用的。
你能告诉我在C++和C#应用程序之间发送整数的正确方法吗?如果你向我解释如何使用协议缓冲区(在C#的情况下是protobuf-net),我会非常高兴。
基本上,这将取决于您使用的网络库以及它们在两端的兼容性。在最低级别,数据以流或字节块的形式传输。当这些字节被转换回字节(甚至是int)之上的任何更复杂的结构时,编码显然很重要,需要两端匹配。
最简单的事情就是试着去看看。
听起来您可能对尽可能紧密地打包数据感兴趣(从您对将int转换为chars的评论来看),在这种情况下,您可能只需要在两端编写一组低级别的打包例程。这样一来,您就不用担心编码问题,并且可以从数据包中挤出最后一点。
variant编码没有端序问题,设计上总是小端序。它从最低有效的七位开始一次存储七位的值,并在不剩下一位时使用第八位作为停止位。
您可以使用C#中的Read7BitEncodedInt
方法来读取可变编码的整数。
如果您使用protobuf-net进行编写,WithLengthPrefix方法将为您完成此操作。我非常乐意帮忙(我是作者)。顺便说一句,它抛出异常的原因是变量值本身在protobuf流中通常无效。在WithLengthPrefix的情况下,如果将0作为字段号传递(或者为更纯的protobuf流传递正字段号;但这是可选的),系统将覆盖此项。
碰巧ProtoReader上有一种方法可以读取一个孤立的变量(而不必担心protobuf流语义),如果这有用的话,我可以将其添加到ProtoWriter中。
顺便说一句,就前缀样式而言,Base128与variant相同。有些人更喜欢32位前缀,以便与其他系统结合——因此提供了其他一些前缀。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- ESP8266网络服务器如何流式传输未签名的字符
- ffmpeg H264一次对帧进行编码,用于网络流传输
- C 将char []从网络转换为主机订单,并分配给无符号int
- 网络传输时间从TCP/IP堆栈
- 在网络上传输数据
- 通过网络中的套接字进行文件传输时,该程序中的文件传输错误是什么
- 用于使用 istream/ostream 传输消息的类似网络协议
- 将 int 数组值传输到无符号向量
- C++ 序列化 std::error_code 以便通过网络传输或保存到磁盘
- 网络消息格式化很多字符,int,在CC++中转换
- 使用C++测量网络上 2 个应用程序之间的数据传输速率(带宽),如何获得公正准确的结果
- 消息队列用c++用Qt进行网络传输
- 如何在网络上传输openv Mat
- 无法在无线网络上通过UDP广播进行快速传输
- 当通过网络(远程屏幕播放应用程序)传输JPEG压缩的屏幕分块时,是否建议使用zlib(或类似)压缩
- 通过网络传输int
- 在矢量中插入一个结构作为网络传输的二进制数据
- UDP 传输和维护网络字节顺序