大数据集的编码方案

时间:2014-01-05 10:38:42

标签: encoding

假设有一个安全的传输层可以安全地传输文件,如果我们想在一轮中通过这个频道传输多个文件怎么办?好吧它应该被编码到同一个文件中,所以当Bob收到该文件时能够解码并看到多个文件(例如相册)。我认为ASN.1适用于小型数据集(例如文本证书),但在大型数据集中,这种编码方案可以增加密文大小。

我的问题是您为大型数据集推荐的编码规则是什么?它必须安全(经过审核以便免费利用)和高效(不要大规模增加规模)

1 个答案:

答案 0 :(得分:0)

ASN.1实际上是一种有效的编码。如果你看一个长字节序列(OCTET STRING)的DER编码,你会看到这样的东西:

04 [len] [the data bytes]

其中04是单字节值,len是以合理紧凑格式表示的数据长度。然后按照数据字节。长度为 n 字节的长流的开销是 2 + ceil(log2(n)/ 8)字节;换句话说,对于最高为256太字节的流,开销最多为 8个字节

DER的一个怪癖是在开始编码之前必须知道数据的总长度。但是,BER编码(其中DER只是一个子集)可以解决问题:可以将值拆分为连续的块,而无需事先知道块的数量。每个块的开销将是最小的(例如,对于高达64千字节的块,4个字节),允许总开销小于0.01%。你将无法做得更好。

如果你想将这个大流分成几个内部“文件”,那么你需要一些约定,而ASN.1再次高效:

BigStream ::= SEQUENCE OF SEQUENCE {
        fileName    UTF8String,
        fileData    OCTET STRING
}

SEQUENCE OF的一个通用标头(少于8个字节);那么,对于每个文件,如果使用DER,超出数据本身的开销和名称(UTF-8字符串)将少于20个字节(通常大大减少)。对于巨大的文件,如果长度不易提前计算,可以使用BER编码,开销可以降低到0.01%,如上所述。

如果您的尺寸不足,并且数据是“普通数据”(具有某种结构),请考虑应用compression。大多数编程框架可以使用zlib或者已经提供了与zlib兼容的实现(例如Java和C#/ .NET都有它)。


对于审核,这不是编码问题,而是实施。 ASN.1 / BER编码可以在几行代码中实现,特别是如果您只对OCTET STRINGUTF8StringSEQUENCE感兴趣的话。我们在谈论不到1000行注释的Java或C#;如果您无法审核 那么您就无法审核任何内容。