【问题标题】:Partially decompress and estimate size of actual decompressed data message部分解压并估计实际解压数据报文的大小
【发布时间】:2015-12-31 03:10:12
【问题描述】:

我有一个简单的要求,如果消息超过 X 字节的上限,我想丢弃或不处理它。但是,发件人可以压缩消息并发送。如果用户创建一个随机消息,例如全 0 或 1 等,则压缩熵变化很大。然而,假设一个受信任的发件人有办法窥视压缩消息并在解压缩时估计其实际大小。我正在使用使用 java.util.zip 的 Zip 协议,但我对其他库或语言中的任何解决方案持开放态度。

【问题讨论】:

  • 如果您只担心“可信”用户会发送合理的消息,为什么不使用固定的近似值?
  • 信任但验证 :) 在更严肃的说明中,我的意思是信任,因为消息不会是垃圾邮件或 DOS 消息,但用户可以说将非常大的 XML 或 PDF 夹在信息 。消息很少会超过我们设置的 MAX 限制。
  • 你怎么能通过偷看来判断呢?如果有一些灾难性的减压,直到它发生,你才能找到它!

标签: java zip compression data-compression lossless-compression


【解决方案1】:

不是真的。

Deflate 是一种流格式,它在开始之前对数据一无所知,因此无法嵌入解压缩后的大小(snappy、brieflz 等格式)。

您能做的最好的可能是使用流 API 最多解压缩 MAX_MESSAGE_SIZE 字节(您可能需要使用 MAX_MESSAGE_SIZE + 1;使用 zlib 很难判断是否到达流的末尾或者如果它只是处理所有可用的输入,除非你给它足够的空间来实际解压缩更多数据)。如果您认为消息太长,这不会让您提前停止处理,但会在消息真的太长时让您停止处理(这应该足以缓解 DoS)。

不幸的是,您不能仅根据您所看到的情况来估计总大小,因为有人可能很容易在流的开头拥有难以压缩的数据,然后是一百万个相同的字节,这将是非常 压缩得很好。

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多