我(接近)对这个话题完全陌生,并在此阅读了很多内容。书籍,Stackexchange,博客等。你知道,开发人员的共同点。我觉得当你可以调试和测试你所读到的内容时,更容易实现“全局理解”。我找到了很多理论信息,但没有尝试“拔掉”的实用方法。
到目前为止,我的想法大致是这样的:
byte[]
,BitConverter.GetBytes
/ BitConverter.ToInt32
,Encoding.UTF8.GetString()
在这里与数组开始的某种位置密切相关。就好像数据报中的前4个字节包含一个msg一样,那么sessionin的startindex将是4?所有这些都是为了这个目的而感到沉重的东西。
有没有更好的方法来打包/解压缩这样的数组? 消息/数据报的大小最大为64kb,并且从不对不同的消息进行扩展。
更具体:我想模拟(控制台应用程序,即)a 传入数据包并解压缩对我有用的信息 系统。然后相反,将答案传回字节数组。 为此目的的样本类如何看待/处理?如何编码/ 解码到它?协议规范具有固定的数据包字节。我会留下一个 下面的例子(虽然不是来自真实的规范);
// One Packet
//
// Description -> |Identifier|name length|message length| name | message |
// Size in bytes -> | 4 | 4 | 4 |name length|message length|
答案 0 :(得分:2)
在大多数情况下,您不会自己读取/写入二进制信息。有几个框架可以将类/结构序列化为二进制数据/从二进制数据序列化。 BinaryFormatter
或protobuf有两种方式。
但是如果你想自己尝试一下,我建议你只使用FileStream
,因为它与任何其他流完全一样(有点简化的陈述,但几乎是真的;)使用BinaryWriter
来写信息和BinaryReader
阅读。
没有理由直接处理byte[]
数组。您随时可以使用MemoryStream
初始化BinaryReader
以获取对BinaryWriter
和// Description -> |Identifier|name length|message length| name | message |
// Size in bytes -> | 4 | 4 | 4 |name length|message length|
using (var stream = new MemoryStream(yourByteBuffer))
{
using (reader = new BinaryReader(stream))
{
var identifier = reader.ReadInt32();
var nameLength = reader.ReadInt32();
var msgLength = reader.ReadInt32();
var name = reader.ReadChars(nameLength);
var msg = reader.ReadChars(msgLength);
}
}
// to get a string from the chars:
var message = new string(msg);
重要的是你以完全相同的顺序读/写字段。
使用您更新的问题的示例:
{{1}}
答案 1 :(得分:0)
System.IO
包含用于处理文件和字节流的类型。其中许多包括例子,例如。打开文件以读取字节流:FileStream Constructor (String, FileMode)。