2

プロトコル バッファは、既に圧縮されている byte[] の圧縮をどのように処理しますか?

疑似例:

[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仕様には圧縮は含まれていませんC#varintのAは、 protobufタイプとして扱われます。これは、バイトの長さプレフィックス付きのrawダンプであることを意味します。したがって、(例として)12バイトの場合、次の要素で構成される14バイトでシリアル化されます。byte[] bytesCompressedFoo

  • データ型(2、長さの接頭辞を示す)とフィールド番号(2、から[ProtoMember(2)])の場合は1バイト、一緒にマッシュ(「シフト」)され、varintエンコードされます
  • データの長さは1バイト(12)、varintエンコード
  • データ用に12バイト(から「そのまま」取得CompressedFoo
于 2012-05-23T11:02:34.010 に答える