[英]Base64 encoding in Java / Groovy
在Java中将byte []转换为Base64字符串的正确方法是什么? 更好的是Grails / Groovy,因为它告诉我不推荐使用encodeAsBase64()
函数。 建议不要使用sun.misc.BASE64Encoder
包,并在某些Windows平台上输出不同大小的字符串。
在groovy中执行此操作的首选方法是:
def encoded = "Hello World".bytes.encodeBase64().toString()
assert encoded == "SGVsbG8gV29ybGQ="
def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64())
assert decoded == "Hello World"
Apache Commons有许多实用程序:
二进制包: http : //commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html
您可以使用开源Base64Coder库
import biz.source_code.base64Coder.Base64Coder
@Grab(group='biz.source_code', module='base64coder', version='2010-09-21')
String s1 = Base64Coder.encodeString("Hello world")
String s2 = Base64Coder.decodeString("SGVsbG8gd29ybGQ=")
像这样实现你自己的方法:)
public class Coder {
private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
public static String encodeAsBase64(String toEncode) {
return encodeAsBase64(toEncode.getBytes())
}
public static String encodeAsBase64(byte[] toEncode) {
int pos = 0;
int onhand = 0;
StringBuffer buffer = new StringBuffer();
for(byte b in toEncode) {
int read = b;
int m;
if(pos == 0) {
m = (read >> 2) & 63;
onhand = read & 3;
pos = 1;
} else if(pos == 1) {
m = (onhand << 4) + ((read >> 4) & 15);
onhand = read & 15;
pos = 2;
} else if(pos == 2) {
m = ((read >> 6) & 3) + (onhand << 2);
onhand = read & 63;
buffer.append(base64code.charAt(m));
m = onhand;
onhand = 0;
pos = 0;
}
buffer.append(base64code.charAt(m));
}
while(pos > 0 && pos < 4) {
pos++;
if(onhand == -1) {
buffer.append('=');
} else {
int m = pos == 2 ? onhand << 4 : (pos == 3 ? onhand << 2 : onhand);
onhand = -1;
buffer.append(base64code.charAt(m));
}
}
return buffer.toString()
}
}
(将此添加到此主题中,希望其他人会受到打击并且不必浪费他宝贵的时间)
今天当我尝试在我的Grails 2.3.11 / Groovy 2.1.9应用程序中添加输出时,我受到了阻碍
String src = render(
model: ...,
template: ...,
)
.encodeAsBase64()
作为DOM元素的data-
属性。 但是相应JavaScript中的atob()
,即从data属性解码Base64字符串的代码,一直抱怨非法字符,而其他解码器,例如base64 -d
接受相同的Base64字符串没有问题。
解决方案是将render()
返回值强制为单个字符串,然后应用Base64编码,即
String src = render(
model: ...,
template: ...,
)
.toString()
.encodeAsBase64()
或者(如果您认为encodeAsBase64()
已弃用):
String src = render(
model: ...,
template: ...,
)
.toString()
.bytes
.encodeBase64() // add 'true' for chunked output
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.