【问题标题】:Shortest String encoding for a byte array字节数组的最短字符串编码
【发布时间】:2019-08-17 17:30:00
【问题描述】:

我有这段代码可以生成 UBJSON 字节数组

UBObject obj = UBValueFactory.createObject();
obj.put("appId", UBValueFactory.createString("70cce8adb93c4c968a7b1483f2edf5c1"));
obj.put("apiKey", UBValueFactory.createString("a65d8f147fa741b0a6d7fc43e18363c9"));
obj.put("entityType", UBValueFactory.createString("Todo"));
obj.put("entityId", UBValueFactory.createString("2-0"));
obj.put("blobName", UBValueFactory.createString("blobName"));

ByteArrayOutputStream out = new ByteArrayOutputStream();
UBWriter writer = new UBWriter(out);
try {
    writer.write(obj);
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

// Byte array of UBJSON
byte[] ubjsonBytes = out.toByteArray();

问题是,这里可以对字节数组进行的最短字符串编码是什么,可以通过 HTTP URL 使用和传输?使用 Base64 非常适合作为 URL 路径或查询参数,但会产生相当长的字符串。

【问题讨论】:

    标签: java encoding


    【解决方案1】:

    根据输入长度和其他属性,您可能希望在使用 Base64 编码 byte[] 之前尝试使用 gzip 压缩输入。通常使用URL friendly variant of Base64

    因此,存在针对 URL 变体的修改 Base64(例如 RFC 4648 中的 base64url),其中标准 Base64 的 +/ 字符分别替换为 -_,以便使用URL 编码器/解码器不再是必需的,并且对编码值的长度没有影响,保持相同的编码形式完好无损,可用于一般的关系数据库、Web 表单和对象标识符。

    某些变体允许或要求省略填充 = 符号以避免它们与字段分隔符混淆,或要求任何此类填充都进行百分比编码。一些库会将= 编码为.,当文件夹名称从用户数据编码时,可能会使应用程序受到相对路径攻击。

    您可以尝试使用Base85,但它使用可以改变 URL 含义的字符进行编码,例如&。这可能适用于您的设置,也可能不适用于您的设置,并且可能取决于反向代理配置等内容。因此,通常最好使用像 Base64 这样的安全编码。

    总而言之,长数据应该进入请求正文而不是 URL。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多