我是网络编程的新手,所以我有一个问题:在我的情况下,在C++和C#之间发送一个整数(假设是16位整数,因为32有“endianess”问题)是否安全,如何做到?
在我的程序中,我将int转换为char (我知道它小于255)并发送它。但是,我想发送32个int。我试着用协议缓冲区来实现这一点。我在C++中使用了WriteVarint32,在C#中使用了ProtoReader.ReadUInt32,但没有成功(在C#中例外)。在我读了this之后,我认为它会起作用。
您能建议我在C++和C#应用程序之间发送整数的正确方法吗?如果您向我解释如何使用protocol buffers (在C#中为protobuf-net)实现这一点,我将非常高兴。
发布于 2011-06-04 19:51:20
如果您正在使用protobuf-net编写,WithLengthPrefix方法将为您完成此操作。我非常乐意在这方面提供帮助(我是作者)。顺便说一句,它抛出异常的原因是varint值本身在protobuf流中通常是无效的。在WithLengthPrefix的情况下,如果您传递0作为字段编号(或者为更纯的protobuf流传递一个正的字段编号;但这是可选的),则系统将覆盖此字段编号。
碰巧的是,ProtoReader上有一个读取隔离变量的方法(不用担心protobuf流语义),如果这对我有用的话,将其添加到ProtoWriter中对我来说是微不足道的。
顺便说一句--就PrefixStyle而言,Base128和varint是一样的。有些人更喜欢32位前缀,以便与其他系统结合-因此提供了一些其他系统。
发布于 2011-06-04 18:00:17
基本上,这将取决于您使用的网络库以及它们在两端的兼容性。在最低级别,数据以字节流或字节块的形式传输。当这些字节被转换回一个字节之上的任何更复杂的结构(甚至是int)时,编码显然很重要,并且需要在两端进行匹配。
最简单的事情就是试一试,看看。
听起来您可能对尽可能紧密地打包数据感兴趣(从您关于将整数转换为字符的评论),在这种情况下,您可能应该在两端编写一组低级打包例程。这样你就不用担心编码问题了,你可以把包里的每一个比特都挤出来。
发布于 2011-06-04 18:07:37
varint编码没有字节序问题,它总是被设计成小字节序。它一次存储7位的值,从最低有效的7位开始,当没有更多的1位时,使用第8位作为停止位。
您可以在C#中使用Read7BitEncodedInt方法来读取可变编码的整数。
https://stackoverflow.com/questions/6236020
复制相似问题