Base64 encoding in Java / Groovy

前端 未结 5 1489
太阳男子
太阳男子 2020-12-14 16:27

What is the proper way to convert a byte [] to a Base64 string in Java? Better yet would be Grails / Groovy because it tells me that the encodeAsBase64() functi

相关标签:
5条回答
  • 2020-12-14 16:36

    Apache Commons has many utilities:

    Binary Package: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html

    Download: http://commons.apache.org/codec/download_codec.cgi

    0 讨论(0)
  • 2020-12-14 16:36

    Implement your own method like this :)

    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()
    }
    

    }

    0 讨论(0)
  • 2020-12-14 16:41

    You could use the open source Base64Coder library

    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=")
    
    0 讨论(0)
  • 2020-12-14 16:46

    (adding this to this thread in the hopes that somebody else will get a hit on this and doesn't have to waste his valuable time)

    I got stymied today when I tried to add in my Grails 2.3.11/Groovy 2.1.9 application the output of

    String src = render(
            model:    ...,
            template: ...,
        )
        .encodeAsBase64()
    

    as a data- attribute to a DOM element. But the atob() in the corresponding JavaScript, i.e. the code that decodes the Base64 string from the data attribute, kept complaining about illegal characters, while other decoders, e.g. base64 -d accepted the same Base64 string without problems.

    The solution is to force the render() return value to a single string and then apply the Base64 encoding, i.e.

    String src = render(
            model:    ...,
            template: ...,
        )
        .toString()
        .encodeAsBase64()
    

    or (if you consider encodeAsBase64() as deprecated):

    String src = render(
            model:    ...,
            template: ...,
        )
        .toString()
        .bytes
        .encodeBase64() // add 'true' for chunked output
    
    0 讨论(0)
  • 2020-12-14 16:53

    The preferred way to do this in groovy is:

     def encoded = "Hello World".bytes.encodeBase64().toString()
     assert encoded == "SGVsbG8gV29ybGQ="
     def decoded = new String("SGVsbG8gV29ybGQ=".decodeBase64())
     assert decoded == "Hello World"
    
    0 讨论(0)
提交回复
热议问题