2013-02-11 93 views
0

我有以下方法:編碼從字節數組的問題一個字符串

/** 
    * Encodes the byte array into base64 string 
    * @param imageByteArray - byte array 
    * @return String a {@link java.lang.String} 
    */ 
public static String encodeImage(byte[] imageByteArray) { 
    return Base64.encodeBase64URLSafeString(imageByteArray); 
} 

我輸入「org.apache.commons.codec.binary.Base64;」但是,我得到的錯誤:在該行

多個標記 - 方法encodeBase64URLSafeString(字節[])是未定義的 類型的Base64 - 行斷點:的MySqlConnection [線:287] - encodeImage(字節[] )

我已將此代碼從「http://www.myjeeva.com/2012/07/how-to-convert-image-to-string-and-string-to-image-in-java/」複製過來。我正在使用Eclipse Juno(完全更新)和GWT。

有沒有人知道我在做什麼錯在這裏?

問候,

格林

謝謝馬庫斯答:我現在已經從您的信息創建此類:

package org.AwardTracker.server; 

public class Base64Decode { 
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

public static byte[] decode(String s) { 

    // remove/ignore any characters not in the base64 characters list 
    // or the pad character -- particularly newlines 
    s = s.replaceAll("[^" + base64chars + "=]", ""); 

    // replace any incoming padding with a zero pad (the 'A' character is 
    // zero) 
    String p = (s.charAt(s.length() - 1) == '=' ? (s.charAt(s.length() - 2) == '=' ? "AA" 
      : "A") 
      : ""); 

    s = s.substring(0, s.length() - p.length()) + p; 
    int resLength = (int) Math.ceil(((float) (s.length())/4f) * 3f); 
    byte[] bufIn = new byte[resLength]; 
    int bufIn_i = 0; 

    // increment over the length of this encrypted string, four characters 
    // at a time 
    for (int c = 0; c < s.length(); c += 4) { 

     // each of these four characters represents a 6-bit index in the 
     // base64 characters list which, when concatenated, will give the 
     // 24-bit number for the original 3 characters 
     int n = (base64chars.indexOf(s.charAt(c)) << 18) 
       + (base64chars.indexOf(s.charAt(c + 1)) << 12) 
       + (base64chars.indexOf(s.charAt(c + 2)) << 6) 
       + base64chars.indexOf(s.charAt(c + 3)); 

     // split the 24-bit number into the original three 8-bit (ASCII) 
     // characters 

     char c1 = (char) ((n >>> 16) & 0xFF); 
     char c2 = (char) ((n >>>8) & 0xFF); 
     char c3 = (char) (n & 0xFF); 

     bufIn[bufIn_i++] = (byte) c1; 
     bufIn[bufIn_i++] = (byte) c2; 
     bufIn[bufIn_i++] = (byte) c3; 

    } 

    return bufIn; 
} 


} 

,改變了呼籲: 進口org.AwardTracker.server .Base64Decode;

public static String encodeImage(byte[] imageByteArray) { 
    return Base64Decode(imageByteArray); [Error on this line] 
} 

,我現在得到的錯誤:

在該行 多個標記 - 方法Base64Decode(字節[])是未定義的類型 的MySqlConnection

幫助greatfuly讚賞。

問候,

格林

第三輪

好了,我有我的加密和解密以防萬一走錯了路。這現在已經被糾正並放置在正確的庫中。但是,我仍然在encodeImage方法中有錯誤。這是我用來調用encodeImage方法的方法。我懷疑是:

java.sql.Blob imageBlob = result.getBlob(1); 
byte[] imageData = imageBlob.getBytes(1, (int) imageBlob.length()); 

是不正確的。但是,我已經將ImageData定義爲byte [],所以我不明白爲什麼encodeImage認爲它是一個String?

public String getImageData(String id){ 
    ResultSet result = null; 
    PreparedStatement ps = null; 
    String imageDataString = null; 
    try { 
     // Read in the image from the database. 
     ps = conn.prepareStatement(
       "SELECT at_cub_details.cd_photograph " + 
         "FROM at_cub_details " + 
         "WHERE at_cub_details.cd_id = \"" + id + "\""); 
     result = ps.executeQuery(); 
     while (result.next()) { 
      java.sql.Blob imageBlob = result.getBlob(1); 
      byte[] imageData = imageBlob.getBytes(1, (int) imageBlob.length()); 

      //Convert Image byte array into Base64 String 
      imageDataString = encodeImage(imageData); 
     } 

    } 

在一個錯誤而導致:

public static String encodeImage(byte[] imageByteArray) { 
    return Base64Encode.encode(imageByteArray); [Error on this line] 
} 

「在類型Base64Encode的方法編碼(字符串)是不適用的參數(字節[])」

感謝所有的幫助。

問候,

格林

附:,我認爲這完全值得我寫一篇博客,因爲我在這方面找不到任何定義的工作,而且我會認爲這會經常使用。我的下一個項目。

編碼類是:

package org.AwardTracker.server; 

public class Base64Encode { 
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

public static String encode(String s) { 

    // the result/encoded string, the padding string, and the pad count 
    String r = "", p = ""; 
    int c = s.length() % 3; 

    // add a right zero pad to make this string a multiple of 3 characters 
    if (c > 0) { 
     for (; c < 3; c++) { 
      p += "="; 
      s += "\0"; 
     } 
    } 

    // increment over the length of the string, three characters at a time 
    for (c = 0; c < s.length(); c += 3) { 

     // we add newlines after every 76 output characters, according to 
     // the MIME specs 
     if (c > 0 && (c/3 * 4) % 76 == 0) 
      r += "\r\n"; 

     // these three 8-bit (ASCII) characters become one 24-bit number 
     int n = (s.charAt(c) << 16) + (s.charAt(c + 1) << 8) 
       + (s.charAt(c + 2)); 

     // this 24-bit number gets separated into four 6-bit numbers 
     int n1 = (n >> 18) & 63, n2 = (n >> 12) & 63, n3 = (n >> 6) & 63, n4 = n & 63; 

     // those four 6-bit numbers are used as indices into the base64 
     // character list 
     r += "" + base64chars.charAt(n1) + base64chars.charAt(n2) 
       + base64chars.charAt(n3) + base64chars.charAt(n4); 
    } 

    return r.substring(0, r.length() - p.length()) + p; 
} 
} 

而解碼類:

package org.AwardTracker.server; 

public class Base64Decode { 
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

public static byte[] decode(String s) { 

    // remove/ignore any characters not in the base64 characters list 
    // or the pad character -- particularly newlines 
    s = s.replaceAll("[^" + base64chars + "=]", ""); 

    // replace any incoming padding with a zero pad (the 'A' character is 
    // zero) 
    String p = (s.charAt(s.length() - 1) == '=' ? (s.charAt(s.length() - 2) == '=' ? "AA" 
      : "A") 
      : ""); 

    s = s.substring(0, s.length() - p.length()) + p; 
    int resLength = (int) Math.ceil(((float) (s.length())/4f) * 3f); 
    byte[] bufIn = new byte[resLength]; 
    int bufIn_i = 0; 

    // increment over the length of this encrypted string, four characters 
    // at a time 
    for (int c = 0; c < s.length(); c += 4) { 

     // each of these four characters represents a 6-bit index in the 
     // base64 characters list which, when concatenated, will give the 
     // 24-bit number for the original 3 characters 
     int n = (base64chars.indexOf(s.charAt(c)) << 18) 
       + (base64chars.indexOf(s.charAt(c + 1)) << 12) 
       + (base64chars.indexOf(s.charAt(c + 2)) << 6) 
       + base64chars.indexOf(s.charAt(c + 3)); 

     // split the 24-bit number into the original three 8-bit (ASCII) 
     // characters 

     char c1 = (char) ((n >>> 16) & 0xFF); 
     char c2 = (char) ((n >>>8) & 0xFF); 
     char c3 = (char) (n & 0xFF); 

     bufIn[bufIn_i++] = (byte) c1; 
     bufIn[bufIn_i++] = (byte) c2; 
     bufIn[bufIn_i++] = (byte) c3; 

    } 

    return bufIn; 
} 


} 

我終於找到了一個編碼類,它的工作原理:

package org.AwardTracker.server; 

public class Base64Encode2 { 
private final static char[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/".toCharArray(); 

    private static int[] toInt = new int[128]; 

    static { 
     for(int i=0; i< ALPHABET.length; i++){ 
      toInt[ALPHABET[i]]= i; 
     } 
    } 

/** 
* Translates the specified byte array into Base64 string. 
* 
* @param buf the byte array (not null) 
* @return the translated Base64 string (not null) 
*/ 
public static String encode(byte[] buf){ 
    int size = buf.length; 
    char[] ar = new char[((size + 2)/3) * 4]; 
    int a = 0; 
    int i=0; 
    while(i < size){ 
     byte b0 = buf[i++]; 
     byte b1 = (i < size) ? buf[i++] : 0; 
     byte b2 = (i < size) ? buf[i++] : 0; 

     int mask = 0x3F; 
     ar[a++] = ALPHABET[(b0 >> 2) & mask]; 
     ar[a++] = ALPHABET[((b0 << 4) | ((b1 & 0xFF) >> 4)) & mask]; 
     ar[a++] = ALPHABET[((b1 << 2) | ((b2 & 0xFF) >> 6)) & mask]; 
     ar[a++] = ALPHABET[b2 & mask]; 
    } 
    switch(size % 3){ 
     case 1: ar[--a] = '='; 
     case 2: ar[--a] = '='; 
    } 
    return new String(ar); 
} 

} 

感謝您的幫助Markus A.非常感謝。

問候,

格林

+0

你有沒有正確的Base64版本,因爲方法已經改變了幾次。確保您擁有的版本具有您正在使用的電話。 – 2013-02-11 03:19:38

+0

你使用URL編碼器對一個字節數組(這是一個圖像?)進行編碼? – texasbruce 2013-02-11 03:19:43

回答

1

GWT不提供阿帕奇百科全書包,所以我不認爲你可以只使用此功能在你的代碼。

以下是你可以在GWT使用的東西:

https://developers.google.com/web-toolkit/doc/latest/RefJreEmulation

如果你想使用它,你需要實際擁有的Base64類的源代碼(以及所有依賴的)可用並將其放到GWT編譯器可以將它轉換爲JavaScript的地方。

對於其他的方法可以做到的編碼,在這裏看到:

How do I encode/decode short strings as Base64 using GWT?

加爲添加到原來的職位新問題:

首先,你需要調用一個靜態函數類似這樣:

return Base64Decode.decode(imageByteArray); 

但是你似乎也有你的類型向後:encodeImage需要一個byte []並返回一個String,而Base64Decode.decode接受一個String並返回一個byte []。您可能需要使用等效的Base64Encode.encode函數,而不是解碼函數。

+0

感謝Markus A.我從你的鏈接中獲取了代碼。但是我仍然遇到錯誤。我已經使用新代碼更新了發佈內容。謝謝格林。 – Glyn 2013-02-11 04:47:47

+0

讓我們希望我的更新答案能夠解決問題;) – 2013-02-11 05:55:34

+0

您好Markus,您在這裏完全符合標記,並且我已經糾正了雙方(即交換我的解碼和編碼)。一個愚蠢的錯誤導致我對此感到沮喪。所以我的班級現在都是正確的,並且處在正確的位置。不過,我仍然遇到了調用encode類的錯誤。請參閱上文。謝謝,格林。 – Glyn 2013-02-11 22:25:35