I have an xml file and I read my data from it, but my question is:
how can I encode the image and then write it into this file? since I want to let my application read the encoded image from the xml file and then store it to Record Store.
Since xml is text and not binary, you'll could use a simple hex encoding, of use base64. The last one is a bit more efficient, but a bit harder to implement.
ImageAsBase64 = "A94jsgbZ39HapwVNDOveOO8hdo3.......";
byte[] b = new Base64Encoding().fromBase64(ImageAsBase64 ); //I couldn't use "Base64()" function, since I have an error "Base64 has private access in com.sun.midp.io"
MyImage = MayImage.createImage(b,0,b.length);
this code works fine in emulator but in my mobile doesn't
the Base64 encoding that i used is already existing in j2me. I tested your class but still I have the same error "Base64 has private access in com.sun.midp.io.Base64" so I changed its name from Base64 to for example Base46 but also have error :(
Running with storage root temp.DefaultColorPhone1193759499234
java.lang.IllegalArgumentException
_at Base46.Base46Decode(Base46.java:82)_
your code didn't work with me, but many thanks for your helping.
I searched for another code and i found this code and it's work fine :)
/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany*/
package Files;
import java.io.*;
publicclass Base64 {
staticfinalchar[] charTab =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray();
publicstatic String encode(byte[] data) {
return encode(data, 0, data.length, null).toString();
}
/** Encodes the part of the given byte array denoted by start and
len to the Base64 format. The encoded data is appended to the
given StringBuffer. If no StringBuffer is given, a new one is
created automatically. The StringBuffer is the return value of
this method. */
publicstatic StringBuffer encode(
byte[] data,
int start,
int len,
StringBuffer buf) {
if (buf == null)
buf = new StringBuffer(data.length * 3 / 2);
int end = len - 3;
int i = start;
int n = 0;
while (i <= end) {
int d =
((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 0x0ff) << 8)
| (((int) data[i + 2]) & 0x0ff);
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append(charTab[(d >> 6) & 63]);
buf.append(charTab[d & 63]);
i += 3;
if (n++ >= 14) {
n = 0;
buf.append("\r\n");
}
}
if (i == start + len - 2) {
int d =
((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 255) << 8);
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append(charTab[(d >> 6) & 63]);
buf.append("=");
}
elseif (i == start + len - 1) {
int d = (((int) data[i]) & 0x0ff) << 16;
buf.append(charTab[(d >> 18) & 63]);
buf.append(charTab[(d >> 12) & 63]);
buf.append("==");
}
return buf;
}
staticint decode(char c) {
if (c >= 'A' && c <= 'Z')
return ((int) c) - 65;
elseif (c >= 'a' && c <= 'z')
return ((int) c) - 97 + 26;
elseif (c >= '0' && c <= '9')
return ((int) c) - 48 + 26 + 26;
elseswitch (c) {
case '+' :
return 62;
case '/' :
return 63;
case '=' :
return 0;
default :
thrownew RuntimeException(
"unexpected code: " + c);
}
}
/** Decodes the given Base64 encoded String to a new byte array.
The byte array holding the decoded data is returned. */
publicstaticbyte[] decode(String s) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
decode(s, bos);
}
catch (IOException e) {
thrownew RuntimeException();
}
return bos.toByteArray();
}
publicstaticvoid decode(String s, OutputStream os)
throws IOException {
int i = 0;
int len = s.length();
while (true) {
while (i < len && s.charAt(i) <= ' ')
i++;
if (i == len)
break;
int tri =
(decode(s.charAt(i)) << 18)
+ (decode(s.charAt(i + 1)) << 12)
+ (decode(s.charAt(i + 2)) << 6)
+ (decode(s.charAt(i + 3)));
os.write((tri >> 16) & 255);
if (s.charAt(i + 2) == '=')
break;
os.write((tri >> 8) & 255);
if (s.charAt(i + 3) == '=')
break;
os.write(tri & 255);
i += 4;
}
}
}