Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 低带宽连接的二进制编码?_C#_Encoding_Binary_Compression - Fatal编程技术网

C# 低带宽连接的二进制编码?

C# 低带宽连接的二进制编码?,c#,encoding,binary,compression,C#,Encoding,Binary,Compression,在我的应用程序中,我有一个简单的XML格式的文件,其中包含结构化数据。每个数据项都有一个数据类型和一个值。差不多 <entry> <field type="integer">5265</field> <field type="float">34.23</field> <field type="string">Jorge</field> </entry> 5265 34.23 乔治 现

在我的应用程序中,我有一个简单的XML格式的文件,其中包含结构化数据。每个数据项都有一个数据类型和一个值。差不多

<entry>
  <field type="integer">5265</field>
  <field type="float">34.23</field>
  <field type="string">Jorge</field>
</entry>

5265
34.23
乔治
现在,这种格式允许我们以人类可读的形式获取数据,以便检查各种值,并轻松执行文件的转换和读取以实现互操作性

问题是我们有一个非常低的带宽连接(大约1000 bps,是的,这是每秒比特数),所以XML并不是传输数据的最佳格式。我正在寻找将xml文件编码为更适合传输的二进制等效文件的方法

你知道关于这个问题有什么好的教程吗?

此外,我们在发送之前压缩数据(简单的GZIP),所以我有点担心如果我使用二进制,会丢失压缩比压缩时大小是否会受到严重影响,因此首先尝试对其进行优化是个坏主意?

注意:这不是过早的优化,这是必要的。1000 bps的带宽很低,所以每个字节都很重要


注2:应用程序是用c语言编写的,但任何教程都可以。

您可能需要研究一下。它们产生的有效载荷远小于XML,尽管不一定是最小的有效载荷;它们是否适合您的使用取决于许多因素。不过,他们肯定比从头开始设计自己的方案更容易


根据我(到目前为止,有点有限)的经验,在那里似乎工作得很好。该链接中有一个软件包,可以与VS进行某种程度的集成,并从.proto文件自动创建C#类,这非常好。

您可能需要研究一下。它们产生的有效载荷远小于XML,尽管不一定是最小的有效载荷;它们是否适合您的使用取决于许多因素。不过,他们肯定比从头开始设计自己的方案更容易


根据我(到目前为止,有点有限)的经验,在那里似乎工作得很好。这个链接上有一个包,可以与VS进行某种程度的集成,并从.proto文件自动创建C#类,这非常好。

任何能够有效地将明文格式转换为二进制格式的东西都可能使压缩比变得更差,是的

然而,无论如何,XML优化的二进制格式可能比压缩文本更好。请查看上列出的各种XML二进制格式。我对WBXML有一些经验,但仅此而已

正如JeeBee所说,老实说,定制二进制格式可能是最有效的方法。您可以尝试对其进行gzip处理,但其结果将首先取决于数据是什么样的


是的,正如Skirwan所说,协议缓冲区在这里是一个相当明显的候选者——但是您可能需要考虑自定义浮点表示,这取决于您的实际需求。如果您只需要4SF(并且您知道比例),那么发送一个两字节的整数可能是最好的选择。

任何能够有效地将明文格式转换为二进制格式的东西都可能会使压缩比变得更差,是的

然而,无论如何,XML优化的二进制格式可能比压缩文本更好。请查看上列出的各种XML二进制格式。我对WBXML有一些经验,但仅此而已

正如JeeBee所说,老实说,定制二进制格式可能是最有效的方法。您可以尝试对其进行gzip处理,但其结果将首先取决于数据是什么样的

是的,正如Skirwan所说,协议缓冲区在这里是一个相当明显的候选者——但是您可能需要考虑自定义浮点表示,这取决于您的实际需求。如果您只需要4SF(并且您知道比例),那么发送一个两字节的整数可能是最好的选择。

我会转储XML(无论如何,为了传输,您可以在发送方解构,在接收方重建,在Java中,您可以使用自定义输入/输出流来整洁地完成工作)。使用固定字段进行二进制-数据类型、长度、数据

假设您有8个或更少的数据类型,则将其编码为3位。然后输入长度,例如8位值(0..255)

然后,对于每个数据类型,进行不同的编码

  • 整数/浮点:BCD-每位数4位,使用15作为小数点。或者只是原始位本身(8位int、16位int、32位int、64位长、32位浮点、64位双精度可能需要不同的数据类型)
  • 字符串-你能用7位ASCII而不是8位吗?等等。所有大写字母+数字和一些标点符号可以使您的每个字符减少到6位
您可能希望在其前面加上要传输的字段总数。如果传输有损,则执行CRC或8/10编码,但希望系统已经处理了

但是,不要低估XML文本的压缩程度。我当然会做一些计算来检查实现了多少压缩。

我会转储XML(无论如何,为了传输,您可以在发送方解构,在接收方重建,在Java中,您可以使用自定义输入/输出流来整洁地完成工作)。使用固定字段进行二进制-数据类型、长度、数据

假设您有8个或更少的数据类型,则将其编码为3位。然后输入长度,例如8位值(0..255)

然后,对于每个数据类型,进行不同的编码

  • 整数/浮点:BCD-每位数4位,使用15作为小数点。或者只是原始位本身(8位int、16位int、32位int、64位长、32位浮点、64位双精度可能需要不同的数据类型)
  • 字符串-你能用7位ASCII而不是8位吗?等。所有大写字母+数字和
    [ProtoContract]
    class EntryItem {
        [ProtoMember(1)]
        public int? Int32Value {get;set;}
        [ProtoMember(2)]
        public float? SingleValue {get;set;}
        [ProtoMember(3)]
        public string StringValue {get;set;}
    }
    [ProtoContract]
    class Entry {
        [ProtoMember(1)]
        public List<EntryItem> Items {get; set;}
    }
    
    [TestFixture]
    public class TestEntries {
        [Test]
        public void ShowSize() {
            Entry e = new Entry {
                Items = new List<EntryItem>{
                    new EntryItem { Int32Value = 5265},
                    new EntryItem { SingleValue = 34.23F },
                    new EntryItem { StringValue = "Jorge" }
                }
            };
            var ms = new MemoryStream();
            Serializer.Serialize(ms, e);
            Console.WriteLine(ms.Length);
            Console.WriteLine(BitConverter.ToString(ms.ToArray()));
        }
    }
    
    0A-03-08-91-29-0A-05-15-85-EB-08-42-0A-07-1A-05-4A-6F-72-67-65
    
    T[ype]L[ength][data data data]+
    
    0x01 0x01 0x3F 0x01 0x01 0x2D 0x02 0x06 H E L L O 0x00