繁体   English   中英

字节数组的最短字符串编码

[英]Shortest String encoding for a byte array

我有这段代码生成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上使用和传输的字节数组最短的String编码什么 使用Base64可以完美地用作URL路径或查询参数,但会产生相当长的String。

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

因此,存在针对URL变体的经过修改的Base64(例如RFC 4648中的base64url),其中标准Base64的+/字符分别由-_替换,因此不再需要使用URL编码器/解码器,并且不再使用影响编码值的长度,使相同的编码形式完整地保留在关系数据库,Web表单和对象标识符中。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM