通过网络传输int

本文关键字:int 网络传输 | 更新日期: 2023-09-27 17:58:27

我是网络编程的新手,所以我有一个问题:在我的情况下,在C++和C#之间发送一个整数(假设为16位整数,因为32有"endianes"问题)安全吗?如何发送?

在我的程序中,我将int转换为char(我知道is低于255)并发送它。然而,我想发送32 int。我尝试使用协议缓冲区来执行此操作。我在C++中使用了WriteVarint32,在C#中使用了ProtoReader.ReadUInt32,但没有成功(C#中除外)。我读了这篇文章后觉得它会起作用的。

你能告诉我在C++和C#应用程序之间发送整数的正确方法吗?如果你向我解释如何使用协议缓冲区(在C#的情况下是protobuf-net),我会非常高兴。

通过网络传输int

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

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

听起来您可能对尽可能紧密地打包数据感兴趣(从您对将int转换为chars的评论来看),在这种情况下,您可能只需要在两端编写一组低级别的打包例程。这样一来,您就不用担心编码问题,并且可以从数据包中挤出最后一点。

variant编码没有端序问题,设计上总是小端序。它从最低有效的七位开始一次存储七位的值,并在不剩下一位时使用第八位作为停止位。

您可以使用C#中的Read7BitEncodedInt方法来读取可变编码的整数。

如果您使用protobuf-net进行编写,WithLengthPrefix方法将为您完成此操作。我非常乐意帮忙(我是作者)。顺便说一句,它抛出异常的原因是变量值本身在protobuf流中通常无效。在WithLengthPrefix的情况下,如果将0作为字段号传递(或者为更纯的protobuf流传递正字段号;但这是可选的),系统将覆盖此项。

碰巧ProtoReader上有一种方法可以读取一个孤立的变量(而不必担心protobuf流语义),如果这有用的话,我可以将其添加到ProtoWriter中。

顺便说一句,就前缀样式而言,Base128与variant相同。有些人更喜欢32位前缀,以便与其他系统结合——因此提供了其他一些前缀。