C# 通过网络传输int 我对网络编程很感兴趣,所以我有一个问题:发送一个整数是安全的吗?(假设16位的整数是因为32在“C++”和“C”中有问题),那么怎么办?

C# 通过网络传输int 我对网络编程很感兴趣,所以我有一个问题:发送一个整数是安全的吗?(假设16位的整数是因为32在“C++”和“C”中有问题),那么怎么办?,c#,c++,network-programming,protocol-buffers,protobuf-net,C#,C++,Network Programming,Protocol Buffers,Protobuf Net,在我的程序中,我将int转换为char(我知道它小于255)并发送它。但是,我想发送32 int。我尝试使用协议缓冲区进行此操作。我在C++和PrurRealdRead中使用WraveARTIT32。我想我读过之后它会起作用的 P>你会不会这么好心,给我一个正确的方法,在C++和C语言之间发送一个整数?如果您向我解释了如何使用协议缓冲区(在C#的情况下是protobuf net),我将非常高兴。基本上取决于您使用的网络库以及它们在两端的兼容性。在最低级别,数据以流或字节块的形式传输。当这些字节

在我的程序中,我将int转换为char(我知道它小于255)并发送它。但是,我想发送32 int。我尝试使用协议缓冲区进行此操作。我在C++和PrurRealdRead中使用WraveARTIT32。我想我读过之后它会起作用的


<> P>你会不会这么好心,给我一个正确的方法,在C++和C语言之间发送一个整数?如果您向我解释了如何使用协议缓冲区(在C#的情况下是protobuf net),我将非常高兴。

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

最简单的事情就是试试看


听起来您可能对尽可能紧密地打包数据感兴趣(从您关于将int转换为chars的评论中),在这种情况下,您应该在两端编写一组低级打包例程。这样你就不用担心编码了,你可以把数据包中的每一位都压缩出来。

不同的编码方式没有端点问题,它总是设计成小端点。它一次存储七位值,从最低有效七位开始,当没有更多的一位剩余时,使用第八位作为停止位


使用C#中的
read7bitencodint
方法读取变量编码的整数。

如果使用protobuf net编写,WithLengthPrefix方法将为您执行此操作。我非常乐意帮你(我是作者)。顺便说一句,它引发异常的原因是varint值本身在protobuf流中通常无效。在WithLengthPrefix的情况下,如果您将0作为字段号传递(或者对于更纯的protobuf流传递一个正字段号;但是这是可选的),则系统将覆盖该字段

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


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

那么为什么16位no和32位have会有端点问题呢?16位在bigendian/littleendian机器中会有所不同。我建议您决定一种方法(例如协议缓冲区)并尝试一下,然后询问您遇到的问题。@David varint编码围绕endianness工作(它是隐式的)。我不确定,但我使用的MonoDevelop中似乎没有Read7Bitencodeint。还有其他想法吗?@lord didger:在
BinaryReader
类中。如果您正在使用其他方式读取数据,您可以轻松地对代码进行调整,只需几行代码。您可以在这里找到源代码:我想使用WithLengthPrefix。我的问题是我不知道我应该如何使用C++原型BuffFAPI来构造前缀C?Base128与varint相同-我尝试发送带有大小的varint。C#唤起System.IO.EndOfStreamException。前缀仅在protobuf网络中存在。C++实现认为没有什么类似于这个概念。这方面的策略(在文档中)只有一个简短的提及,基本上是说“增加你自己的长度”。重新部署EOF-我在前面的讨论中添加了一个v2示例(我相信是与您一起),随后重新部署了DLL-检查您是否拥有当前版本。您能简单地给出关于您的策略的几句话,即“我的消息通过C++是27字节,所以我已经写了[ todo:Byth]作为前缀,然后是27个字节”——那么我应该能够看到您所拥有的。消息测试{需要的It32 ID=1;}这是我想发送的消息。现在我设置id(在C++中):Test;测试。设置_id(1234);我发送Varint32编码的_输出->WritePrint32(test.ByteSize());C#应用程序应该准确地接收这些字节(十六进制)03 08 d2 09。03是大小,其余的是消息。目前,我努力将响应从C到C发送回C++。我相信我很快就会完成。@lord-事实上,protobuf net将单个原语(
int
etc)视为字段1消息上的字段,因此获得该原语的最小值是
int I=Serializer.DeserializeWithLengthPrefix(源代码,PrefixStyle.Base128,0)
Serializer.SerializeWithLengthPrefix(ms,1234,PrefixStyle.Base128,0);
(不过需要r404 dll,因为在早期的测试版中有一个bug)。当然,您可以拥有一个带有int属性等的完整对象,这也可以很好地工作。