我有一个简单的要求,如果超过X字节的上限,我想删除或不处理消息。但是,允许发件人压缩邮件并发送。在用户创建具有全0或1等的随机消息的情况下,压缩熵是高度变化的。但是假设有一个可信赖的发送者有一种方法来查看压缩消息并估计其在解压缩时的实际大小。我使用java协议使用java.util.zip,但我对其他库或语言中的任何解决方案都是开放的。
答案 0 :(得分:1)
不是。
Deflate是一种流格式,它在启动之前对数据一无所知,因此无法嵌入解压缩的大小(snappy,brieflz和其他一些格式)。
你可以做的最好的事情就是使用流API来解压缩最多MAX_MESSAGE_SIZE
个字节(你可能需要使用MAX_MESSAGE_SIZE + 1
;对于zlib,很难判断是否结束到达流或者它是否只是处理了所有可用的输入,除非你给它足够的空间来实际解压缩更多的数据)。如果您认为消息太长,这将不会让您停止处理早期,但是一旦消息确实太长(这应该足以缓解DoS),您将立即停止处理。
不幸的是,您不能仅根据您所看到的内容估算总大小,因为有人可能很容易在流的开头压缩难以压缩的数据,然后是一百万个相同的字节,这将非常 压缩得很好。