2

协议缓冲区如何处理已经压缩的字节 [] 的压缩?

伪示例:

[ProtoContract]
class Foo
{
  [ProtoMember(1)]
  public string Bar{ get; set; }

  [ProtoMember(2)]
  public byte[] CompressedFoo { get; set; }
}


// proto is my ProtocolBuffer.Net utility class

Foo _foo = new Foo() { Bar = "Hello World"; };

Foo _foo2 = new Foo() { Bar = "Goodbye cruel world"; };
_foo2.CompressedFoo = proto.Compress(_foo);

byte[] compressedFoo2 = proto.Compress(_foo2);
4

1 回答 1

1

protobuf 规范不包括任何压缩,除非您计算varint整数数据的编码。C# 中的Abyte[]被视为protobuf bytes类型,这意味着它只是一个以长度为前缀的原始字节转储。因此,如果CompressedFoo是(仅作为示例)12 个字节,它将以 14 个字节序列化它,由以下部分组成:

  • 1 个字节用于数据类型(2, 表示以长度为前缀)和字段编号(2,来自[ProtoMember(2)]),混合在一起(“移位”)并进行 varint 编码
  • 数据长度为 1 个字节 ( 12),varint 编码
  • 12 个字节的数据(从“按原样”获取CompressedFoo
于 2012-05-23T11:02:34.010 回答