在C#中,是否存在从Perl打包和解包的等效程序

本文关键字:和解 程序 包和解 是否 存在 Perl | 更新日期: 2023-09-27 18:26:47

是否有一些库允许执行与打包和解压Perl函数相同的操作?

使用模板列表作为http://perldoc.perl.org/functions/pack.html,

pack用于将列表转换为二进制表示
unpack用于将二进制结构转换为普通Perl变量

简而言之:

我给出了一个byte[]数组,一个解析数据包的模板,以及将接收提取数据的变量。

Mono似乎提供了这样的功能,但模板并不相同,请参阅http://www.mono-project.com/Mono_DataConvert#Obtaining_Mono.DataConvert.

在C#中,是否存在从Perl打包和解包的等效程序

您想要了解的似乎是二进制序列化。从链接;

序列化可以定义为将对象的状态存储到存储器的过程中等的在此过程中,对象的公共和私有字段以及类,包括包含该类的程序集被转换为字节流,然后将其写入数据流。当对象随后被反序列化时将创建原始对象的精确克隆。

这里可以找到一个更具体的C#二进制序列化示例(针对.NET Framework 4.5)。简要简介;必须使用[Serializable]标记对要序列化和反序列化的类进行注释,然后使用Formatter实例实际执行序列化/反序列化。

因此,在Perl中,您可以简单地说:

pack TEMPLATE,LIST

在C#中,您需要以下内容:

[Serializable]
public class MyObject {
  public int n1 = 0;
  public int n2 = 0;
  public String str = null;
}
// ... And in some other class where you have you application logic
public void pack()
{
    MyObject obj = new MyObject();
    obj.n1 = 1;
    obj.n2 = 24;
    obj.str = "Some String";
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, obj);
    stream.Close();
}

为了解决您想要控制序列化模板的想法,您可能需要自己实现ISerializable。这是一篇关于自定义二进制序列化的MSDN文章。通过自己实现接口,您可以获得对二进制模板的高度控制,以换取确保功能的高度复杂性。

http://msdn.microsoft.com/en-us/library/system.bitconverter.tosingle%28v=vs.110%29.aspx

上面的链接显示了更直接等效于打包和解包的方法。