比Base64更短的编码方式

11
我有一个字符串被编码成了Base64字符串:

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

Translated text:

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

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

输出结果为:

ewogICJhcHBJZCI6ICI3MGNjZThhZGI5M2M0Yzk2OGE3YjE0ODNmMmVkZjVjMSIsCiAgImFwaUtleSI6ICJhNjVkOGYxNDdmYTc0MWIwYTZkN2ZjNDNlMTgzNjNjOSIsCiAgImVudGl0eVR5cGUiOiAiVG9kbyIsCiAgImVudGl0eUlkIjogIjItMCIsCiAgImJsb2JOYW1lIjogInBpY3R1cmUiCn0=

在我的情况下,这段代码非常长。我不能使用单向哈希算法,因为它需要在另一端解码。

是否有编码方法与Base64编码相比大小至少可以减少1/4?


1
如果你的JSON有结构,只取值而不是元素名称,可以节省约1/3的存储空间。 - Alex Salauyou
Protobuf 通常比 JSON 小三分之一(尽管在您的情况下,语法和字段名称似乎不占内容的三分之二)。 这已经是最好的结果了。 压缩 可能 可以让您获得更多。 但这实际上取决于您的数据。 - Boris the Spider
2个回答

15
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
好观点,讲得很好。信息论的基本原理表明,您无法任意减少数据而不损失信息。 - Boris the Spider
1
除了Broloid压缩算法之外:https://stackoverflow.com/a/3545608/139985 :-) - Stephen C
1
“几乎所有支持文件名长度和sh参数大小为3 MB或更多的Unix系统都将满足要求。” - 实际上让我笑了。感谢分享! - Boris the Spider

3
如果你正在寻找最短的编码格式,可以考虑使用zlib压缩和base64编码的组合。以下是一个示例代码片段,演示了这种方法:
const zlib = require('zlib');

const jsonString = `{
  "appId": "70cce8adb93c4c968a7b1483f2edf5c1",
  "apiKey": "a65d8f147fa741b0a6d7fc43e18363c9",
  "entityType": "Todo",
  "entityId": "2-0",
  "blobName": "picture"
}`;

// Compress the JSON string using zlib
const compressedData = zlib.deflateSync(jsonString);

// Convert the compressed data to a Base64 string
const base64String = compressedData.toString('base64');

console.log(base64String);

输出将是压缩数据的Base64字符串表示形式。
eJyrVkpUslJQkSjRSlJKyixJLAzU0FJVSkpRgB8RlAOIgAepA4k=

要将Base64字符串解码回原始的JSON字符串,您可以使用以下代码:

// Convert the Base64 string to compressed data
const compressedData = Buffer.from(base64String, 'base64');

// Decompress the data using zlib
const decompressedData = zlib.inflateSync(compressedData);

// Convert the decompressed data back to JSON string
const decompressedJsonString = decompressedData.toString();

console.log(decompressedJsonString);

这将输出原始的JSON字符串:
{
  "appId": "70cce8adb93c4c968a7b1483f2edf5c1",
  "apiKey": "a65d8f147fa741b0a6d7fc43e18363c9",
  "entityType": "Todo",
  "entityId": "2-0",
  "blobName": "picture"
}

通过使用zlib压缩和base64编码的组合,与仅使用Base64编码相比,您可以实现数据的更短表示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接