比 Base64 更短的编码

xyb*_*rek 5 java base64 encoding

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

{
  "appId": "70cce8adb93c4c968a7b1483f2edf5c1",
  "apiKey": "a65d8f147fa741b0a6d7fc43e18363c9",
  "entityType": "Todo",
  "entityId": "2-0",
  "blobName": "picture"
}
Run Code Online (Sandbox Code Playgroud)

输出是:

ewogICJhcHBJZCI6ICI3MGNjZThhZGI5M2M0Yzk2OGE3YjE0ODNmMmVkZjVjMSIsCiAgImFwaUtleSI6ICJhNjVkOGYxNDdmYTc0MWIwYTZkN2ZjNDNlMTgzNjNjOSIsCiAgImVudGl0eVR5cGUiOiAiVG9kbyIsCiAgImVudGl0eUlkIjogIjItMCIsCiAgImJsb2JOYW1lIjogInBpY3R1cmUiCn0=
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*n C 11

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 编码二进制表示。

  • 好点,说得好。信息论的基础知识表明,你不能无损地将数据缩小任意数量。 (2认同)