通过网络转移int

时间:2011-06-04 09:49:30

标签: c# c++ network-programming protocol-buffers protobuf-net

我是网络编程的新手,所以我有一个问题:在我的C ++和C#之间发送一个整数(让我们假设16位整数,因为32有“endianess”问题)是否安全?这是怎么做的? / p>

在我的程序中,我将int转换为char(我知道低于255)并发送它。但是,我想发送32个int。我尝试使用协议缓冲区。我在C ++中使用了WriteVarint32,在C#中使用了ProtoReader.ReadUInt32但没有成功(C#中的异常)。我认为在阅读this之后它会起作用。

你会这么善良并建议我在C ++和C#应用程序之间发送一个整数的正确方法吗?如果您解释我如何使用协议缓冲区(在C#的情况下为protobuf-net),我会非常高兴。

3 个答案:

答案 0 :(得分:1)

基本上,它取决于您使用的网络库以及它们两端的兼容性。在最低级别,数据以流或字节块的形式传输。当这些字节转换回字节上方的任何更复杂的结构(甚至是int)时,编码显然很重要,需要在两端匹配。

最简单的事情就是试试看。

听起来你可能会对尽可能紧密地打包数据感兴趣(从你对ints转换为chars的评论),在这种情况下你可能只需在两端编写一组低级打包例程。这样你就不必担心编码了,你可以从数据包中挤出最后一点。

答案 1 :(得分:1)

varint编码没有endianess问题,它的设计总是小端。它从最低有效7位开始一次存储7位值,并在没有剩余位时使用第8位作为停止位。

使用C#中的Read7BitEncodedInt方法读取varint编码的整数。

答案 2 :(得分:0)

如果您使用protobuf-net编写,WithLengthPrefix方法将为您执行此操作。我非常乐意帮助解决这个问题(我是作者)。 Btw,它抛出异常的原因是varint值本身在protobuf流中通常不是有效的。如果你传递0作为字段编号,系统将在WithLengthPrefix的情况下覆盖它(或者为更纯的protobuf流传递正字段编号;但这是可选的。)

碰巧在ProtoReader上有一个方法来读取一个孤立的varint(不用担心protobuf流的语义),如果有用的话,将它添加到ProtoWriter对我来说是微不足道的。

Btw - 就PrefixStyle而言,Base128与varint相同。有些人喜欢32位前缀,与其他系统结合 - 因此提供了一些其他系统。