【问题标题】:Shorter encoding than Base64比 Base64 更短的编码
【发布时间】:2026-01-10 02:10:02
【问题描述】:

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

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

输出是:

ewogICJhcHBJZCI6ICI3MGNjZThhZGI5M2M0Yzk2OGE3YjE0ODNmMmVkZjVjMSIsCiAgImFwaUtleSI6ICJhNjVkOGYxNDdmYTc0MWIwYTZkN2ZjNDNlMTgzNjNjOSIsCiAgImVudGl0eVR5cGUiOiAiVG9kbyIsCiAgImVudGl0eUlkIjogIjItMCIsCiAgImJsb2JOYW1lIjogInBpY3R1cmUiCn0=

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

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

【问题讨论】:

  • 如果你的 json 是结构化的,只取不带元素名称的值,这样可以节省大约 1/3 的存储空间。
  • Protobuf 在一般情况下大约是 JSON 大小的 1/3(尽管在您的情况下,语法和字段名称似乎不是内容的 2/3) - 这差不多正如你将要得到的。压缩可能让你得到更多。但这真的取决于你的数据。

标签: java encoding base64


【解决方案1】:

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

【讨论】:

  • 说得好。信息论的基本原理表明,您不能以任意数量无损地缩小数据。
  • 除了 broloid 压缩算法:*.com/a/3545608/139985 :-)
  • "几乎所有支持文件名长度和 3 MB 或更大的 sh 参数大小的 unix 系统都可以满足要求。" - 真的让我笑了。感谢分享!