小编Ste*_*del的帖子

为什么base64编码的数据压缩如此糟糕?

我最近压缩了一些文件,我注意到base64编码的数据似乎压缩得非常糟糕.这是一个例子:

  • 原始档案:429,7 MiB
  • 压缩通过xz -9:
    13,2 MiB / 429,7 MiB = 0,031 4,9 MiB/s 1:28
  • base64它并压缩通过xz -9:
    26,7 MiB / 580,4 MiB = 0,046 2,6 MiB/s 3:47
  • base64原始压缩的xz文件:
    17,8 MiB几乎没有时间=预期1.33x的大小增加

所以可以观察到的是:

  • xz压缩真的很好☺
  • base64编码的数据压缩不好,比未编码的压缩文件大2倍
  • base64-then-compresscompress-then-base64明显更差,更慢

怎么会这样?Base64是一种无损,可逆的算法,为什么它会如此影响压缩呢?(我也试过gzip,结果相似).

我知道base64然后压缩文件是没有意义的,但大多数时候一个人无法控制输入文件,我会想到,因为实际的信息密度(或任何它被称为base64编码文件的几乎与非编码版本相同,因此可以类似地压缩.

compression lossless-compression

45
推荐指数
2
解决办法
3万
查看次数

为什么Oracle Java编译器不能在这里推断出界限,但Eclipse可以?

我有这个(貌似)无辜的代码(在这里简化为这个JUnit测试用例):

import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.function.Supplier;

import org.junit.Test;

public class GenericsTest {
    private static boolean doFail;

    private static Map<String, Number> createMap() {
        if (doFail) {
            throw new IllegalArgumentException();
        }
        return new HashMap<>();
    }

    public static <T> T get(final Callable<T> _valueCreator, final Supplier<T> _errorValue) {
        try {
            return _valueCreator.call();
        } catch (final Exception e) {
            return _errorValue.get();
        }
    }

    public static Map<String, Number> getCachedMap() {
        return get(GenericsTest::createMap, Collections::emptyMap);
    }

    @Test …
Run Code Online (Sandbox Code Playgroud)

java eclipse generics compiler-errors

5
推荐指数
1
解决办法
1068
查看次数