我有以下方法:編碼從字節數組的問題一個字符串
/**
* 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.非常感謝。
問候,
格林
你有沒有正確的Base64版本,因爲方法已經改變了幾次。確保您擁有的版本具有您正在使用的電話。 – 2013-02-11 03:19:38
你使用URL編碼器對一個字節數組(這是一個圖像?)進行編碼? – texasbruce 2013-02-11 03:19:43