java - 比 Base64 更短的编码
问题描述
我有这个被编码成 Base64 字符串的字符串:
{
"appId": "70cce8adb93c4c968a7b1483f2edf5c1",
"apiKey": "a65d8f147fa741b0a6d7fc43e18363c9",
"entityType": "Todo",
"entityId": "2-0",
"blobName": "picture"
}
输出是:
ewogICJhcHBJZCI6ICI3MGNjZThhZGI5M2M0Yzk2OGE3YjE0ODNmMmVkZjVjMSIsCiAgImFwaUtleSI6ICJhNjVkOGYxNDdmYTc0MWIwYTZkN2ZjNDNlMTgzNjNjOSIsCiAgImVudGl0eVR5cGUiOiAiVG9kbyIsCiAgImVudGl0eUlkIjogIjItMCIsCiAgImJsb2JOYW1lIjogInBpY3R1cmUiCn0=
就我而言,这很长。在我的情况下,我不能使用一种方式散列,因为它需要在另一端进行解码。
与 Base64 编码相比,是否存在至少只有~1/4大小的编码?
解决方案
Base64 编码将二进制数据编码为 64 位字母表中的字符。这意味着规模增加了 33.3%;即 3 个字节变成 4 个字符。
与 Base64 编码相比,是否存在至少只有 ~1/4 大小的编码?
减少到 Base64 大小的 1/4 意味着传输的形式必须小于数据的原始形式。这只有在原始数据是高度可压缩的情况下才能实现。您需要执行以下操作:
- 将原始字节序列压缩超过4 倍。
- 将二进制文件应用于文本编码。
鉴于第一步仅适用于可压缩数据,并且许多数据格式(例如图像、视频、声音、ZIP 文件)已经被压缩,所以在一般情况下,您的问题的答案是否定的。
对于您的具体示例,我认为答案是“可能不是”。该 JSON 字符串中有相当多的冗余,但我怀疑通用压缩算法能否将其压缩 4 倍。
更好的方法是设计一个紧凑的二进制表示:
- 将 id 和 key 编码为字节
- 将名称编码为 ASCII 或 UTF-8 字节序列 + 字节数。
- 摆脱属性名称
- 摆脱其他 JSON 语法开销。
然后 Base64 对二进制表示进行编码。
推荐阅读
- sql - 为大于日期列且小于另一个日期列的每一天添加一个新的日期行?
- javascript - Discord.js - 从交互中获取消息
- latex - Latex中具有多行和多列的长表
- javascript - 样式显示时如何添加过渡?
- rust - 将double转换为float时如何确定舍入方向?
- r - 使用 Splashr 等待完整的页面加载
- reactjs - 路径似乎对图像是正确的,但我的 svg 没有显示
- c# - 为什么当我的鼠标统一悬停在一个对象上时,它称它为错误的对象?
- javascript - 我将如何保持用户令牌状态,以便即使刷新我的按钮也会保留在页面上?
- javascript - 获取'/'之前的最后一个值