首页 > 解决方案 > 比 Base64 更短的编码

问题描述

我有这个被编码成 Base64 字符串的字符串:

{
  "appId": "70cce8adb93c4c968a7b1483f2edf5c1",
  "apiKey": "a65d8f147fa741b0a6d7fc43e18363c9",
  "entityType": "Todo",
  "entityId": "2-0",
  "blobName": "picture"
}

输出是:

ewogICJhcHBJZCI6ICI3MGNjZThhZGI5M2M0Yzk2OGE3YjE0ODNmMmVkZjVjMSIsCiAgImFwaUtleSI6ICJhNjVkOGYxNDdmYTc0MWIwYTZkN2ZjNDNlMTgzNjNjOSIsCiAgImVudGl0eVR5cGUiOiAiVG9kbyIsCiAgImVudGl0eUlkIjogIjItMCIsCiAgImJsb2JOYW1lIjogInBpY3R1cmUiCn0=

就我而言,这很长。在我的情况下,我不能使用一种方式散列,因为它需要在另一端进行解码。

与 Base64 编码相比,是否存在至少只有~1/4大小的编码?

标签: javaencodingbase64

解决方案


Base64 编码将二进制数据编码为 64 位字母表中的字符。这意味着规模增加了 33.3%;即 3 个字节变成 4 个字符。

与 Base64 编码相比,是否存在至少只有 ~1/4 大小的编码?

减少到 Base64 大小的 1/4 意味着传输的形式必须小于数据的原始形式。这只有在原始数据是高度可压缩的情况下才能实现。您需要执行以下操作:

  1. 将原始字节序列压缩超过4 倍。
  2. 将二进制文件应用于文本编码。

鉴于第一步仅适用于可压缩数据,并且许多数据格式(例如图像、视频、声音、ZIP 文件)已经被压缩,所以在一般情况下,您的问题的答案是否定的。

对于您的具体示例,我认为答案是“可能不是”。该 JSON 字符串中有相当多的冗余,但我怀疑通用压缩算法能否将其压缩 4 倍。

更好的方法是设计一个紧凑的二进制表示:

  • 将 id 和 key 编码为字节
  • 将名称编码为 ASCII 或 UTF-8 字节序列 + 字节数。
  • 摆脱属性名称
  • 摆脱其他 JSON 语法开销。

然后 Base64 对二进制表示进行编码。


推荐阅读