public String getUnsecureContentBase64(String url)
throws ClientProtocolException, IOException {
//getUnsecureContent will generate some byte[]
byte[] result = getUnsecureContent(url);
// use apache org.apache.commons.codec.binary.Base64
// if you're sending back as a http request result you may have to
// org.apache.commons.httpclient.util.URIUtil.encodeQuery
return Base64.encodeBase64String(result);
}
6条答案
按热度按时间lc8prwob1#
下面是base64编码字节数组的一个很好的例子。当你在发送PDF文档时使用unicode字符时,它会变得更加复杂。在编码字节数组之后,编码后的字符串可以用作JSON属性值。
Apache commons提供了很好的实用程序:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
Java服务器端示例:
JavaScript解码:
t5zmwmid2#
在json中发送二进制的典型方法是base64编码。
Java提供了不同的方法来对
byte[]
进行Base64编码和解码,其中之一就是DatatypeConverter
。很简单
您必须根据您使用的json解析器/生成器库来进行这种转换。
ax6ht2ek3#
令人惊讶的是,现在org.json允许你把byte[]对象直接放到一个json中,并且它仍然是可读的。你甚至可以通过一个WebSocket发送结果对象,它在另一端也是可读的。但是我还不确定结果对象的大小是大于还是小于你将byte数组转换为base64时的大小,如果它小一点肯定会很整洁。
要衡量这样一个json对象在java中占用了多少空间似乎是难以置信的困难。如果你的json仅仅由字符串组成,那么通过简单地将它字符串化就可以很容易地实现,但是如果它里面有一个字节数组,我担心它就不那么简单了。
在java中对json进行字符串化会将bytearray替换为一个10个字符的字符串,看起来像一个id。在node.js中执行相同的操作会将
byte[]
替换为一个无引号的值阅读读作<Buffered Array: f0 ff ff ...>
,后者的长度表明大小增加了大约300%,这是可以预期的bqucvtff4#
与@Qwertie的建议一致,但在懒惰的一面更进一步,你 * 可以 * 假装每个字节都是一个ISO-8859-1字符。对于门外汉来说,ISO-8859-1是一个单字节编码,与Unicode的前256个码位匹配。
所以@Ash的答案实际上可以用字符集来弥补:
这种编码具有与BAIS相同的可读性,其优点是处理速度比BAIS或base64都快,因为需要的分支更少。看起来JSON解析器做得更多,但这没关系,因为通过转义或UTF-8处理非ASCII是JSON解析器工作的一部分。它 * 可以 * 更好地Map到一些格式,如带有配置文件的MessagePack。
然而,在空间方面,这通常是一个损失,因为没有人会在JSON中使用UTF-16。在UTF-8中,每个非ASCII字节将占用2个字节,而BAIS使用(2+4n + r?(r+1):0)个字节来表示每3n+r 个这样的字节(r是余数)。
pbpqsu0x5#
如果您的字节数组可能包含您希望能够看到的ASCII字符串,那么您可能更喜欢BAIS(字符串中的字节数组)格式,而不是Base64。BAIS的好处是,如果所有字节碰巧都是ASCII,它们会被一对一地转换为字符串(例如,字节数组
{65,66,67}
变成简单的"ABC"
)而且,BAIS通常给你一个比Base64更小的文件大小(这是不能保证的)。在将字节数组转换为BAIS字符串之后,像处理任何其他字符串一样将其写入JSON。
下面是一个Java类(从original C#移植而来),用于将字节数组转换为字符串。
另请参阅:C# unit tests。
gjmwrych6#
简单地说