Javaでバイト[]をBase64文字列に変換する適切な方法は何ですか? encodeAsBase64()
関数が廃止されていることを通知するため、Grails/Groovyの方が適しています。 Sun.misc.BASE64Encoder
パッケージの使用は推奨されておらず、一部のWindowsプラットフォームでは異なるサイズの文字列を出力します。
Apache Commonsには多くのユーティリティがあります。
バイナリパッケージ: http://commons.Apache.org/codec/apidocs/org/Apache/commons/codec/binary/Base64.html
これをgroovyで行うための推奨される方法は次のとおりです。
def encoded = "Hello World".bytes.encodeBase64().toString()
assert encoded == "SGVsbG8gV29ybGQ="
def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64())
assert decoded == "Hello World"
あなたはオープンソースを使うことができます 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
_