Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> base64, Чем кодировать? 
:(
    Опции темы
Arahnus
Дата 10.11.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.5.2009

Репутация: нет
Всего: нет



В нете нашел несколько ссылок на класс для работы с base64 но ссылки битые.

Поэтому остается вопрос как в j2me работать с base64?
PM MAIL   Вверх
Green_DiCk
Дата 11.11.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Arahnusвот нашёл

Не знаю - рабочий ли код, но судя по всему рабочий.. с фига ему не работать? smile 


UPD: Сорри, там только энкодинг.. Декодинга нет.

Это сообщение отредактировал(а) Green_DiCk - 11.11.2009, 21:04
PM MAIL   Вверх
math64
Дата 12.11.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Вот мой код декодирования фотографии телефонного справочника(интересно, а во всех телефонах он хранится в base64?)
Код

  private Image decodeImage(byte[] b) {
    if (b == null)
      return null;
    try {
      return Image.createImage(b, 0, b.length);
    } catch (Exception e) {
    }
    int len = b.length;
    while(len > 0 && b[len-1] == '=') len--;
    byte[] res = new byte[len*3/4];
    for (int i = 0; i < res.length; i++)
      res[i] = 0;
    for (int i = 0, j = 0, sh = 0; i < len; i++) {
      int c = b[i];
      if (c >= 'A' && c <= 'Z')
        c = c - 'A';
      else if (c >= 'a' && c <= 'z')
        c = c - 'a' + 0x1A;
      else if (c >= '0' && c <= '9')
        c = c - '0' + 0x34;
      else if (c == '+')
        c = 0x3E;
      else if (c == '/')
        c = 0x3F;
      else break;
      if (sh != 0)
        res[j++] |= c >> (6 - sh);
      if (j >= res.length)
        break;
      sh += 2;
      if (sh == 8)
        sh = 0;
      else
        res[j] |= c << sh;
    }
    return Image.createImage(res, 0, res.length);
  }

PM   Вверх
Arahnus
Дата 14.11.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.5.2009

Репутация: нет
Всего: нет



Спасибо за внимание.
Я вобщем то решил проблему, просто не сразу написал так как систему востанавливал.

Вопрос возник потому что прочитал что класс base64  из пакета com\sun\midp\io лучше не использовать так как есть проблема переносимости между kvm, к тому же он приватный.
Однако проблема решена путем перекомпиляции этого класса. Снимаем с класса privat и вставляем его в свою программу. И дело в шляпе.

Добавлено через 10 минут и 1 секунду
Бывает что пойдеш искать по гуглу, и он выдает сайты где опять посылают погуглить.
Этим гугл и набивает себе хосты - тем что посылает сам на себя рекурсивно.

Поэтому я просто выложу весь код этого класса

Код

import java.io.IOException;

public class Base64
{
  static private final char[] ALPHABET;
  static private int[] valueDecoding;

  Base64() {
  }

  static public String encode(byte[] data, int offset, int length) {
    int i;
    int encodedLen;
    char[] encoded;
    encodedLen = ((length + 2) / 3) * 4;
    encoded = new char[encodedLen];
    i = 0;
    encodedLen = 0;
    while (encodedLen < encoded.length) {
      Base64.encodeQuantum(data, offset + i, length - i, encoded, encodedLen);
      i += 3;
      encodedLen += 4;
    }
    return new String(encoded);
  }

  static private void encodeQuantum(byte[] in, int inOffset, int len, char[] out, int outOffset) {
    byte a;
    byte b;
    byte c;
    a = 0;
    b = 0;
    c = 0;
    a = in[inOffset];
    out[outOffset] = ALPHABET[(a >>> 2) & 63];
    if (len > 2) {
      b = in[inOffset + 1];
      c = in[inOffset + 2];
      out[outOffset + 1] = ALPHABET[((a << 4) & 48) + ((b >>> 4) & 15)];
      out[outOffset + 2] = ALPHABET[((b << 2) & 60) + ((c >>> 6) & 3)];
      out[outOffset + 3] = ALPHABET[c & 63];
    }
    else if (len > 1) {
      b = in[inOffset + 1];
      out[outOffset + 1] = ALPHABET[((a << 4) & 48) + ((b >>> 4) & 15)];
      out[outOffset + 2] = ALPHABET[((b << 2) & 60) + ((c >>> 6) & 3)];
      out[outOffset + 3] = 61;
    }
    else {
      out[outOffset + 1] = ALPHABET[((a << 4) & 48) + ((b >>> 4) & 15)];
      out[outOffset + 2] = 61;
      out[outOffset + 3] = 61;
    }
  }

  static public byte[] decode(String encoded) throws java.io.IOException {
    return Base64.decode(encoded, 0, encoded.length());
  }

  static public byte[] decode(String encoded, int offset, int length) throws java.io.IOException {
    int i;
    int decodedLen;
    byte[] decoded;
    if ((length % 4) != 0) {
      throw new java.io.IOException("Base64 string length is not multiple of 4");
    }
    decodedLen = (length / 4) * 3;
    if (encoded.charAt((offset + length) - 1) == 61) {
      decodedLen--;
      if (encoded.charAt((offset + length) - 2) == 61) {
        decodedLen--;
      }
    }
    decoded = new byte[decodedLen];
    i = 0;
    decodedLen = 0;
    while (i < length) {
      Base64.decodeQuantum(encoded.charAt(offset + i), encoded.charAt((offset + i) + 1), encoded.charAt((offset + i) + 2), encoded.charAt((offset + i) + 3), decoded, decodedLen);
      i += 4;
      decodedLen += 3;
    }
    return decoded;
  }

  static private void decodeQuantum(char in1, char in2, char in3, char in4, byte[] out, int outOffset) throws java.io.IOException {
    int a;
    int b;
    int c;
    int d;
    int pad;
    a = 0;
    b = 0;
    c = 0;
    d = 0;
    pad = 0;
    a = valueDecoding[in1 & 127];
    b = valueDecoding[in2 & 127];
    if (in4 == 61) {
      pad++;
      if (in3 == 61) {
        pad++;
      }
      else {
        c = valueDecoding[in3 & 127];
      }
    }
    else {
      c = valueDecoding[in3 & 127];
      d = valueDecoding[in4 & 127];
    }
    if (((a < 0) || ((b < 0) || (c < 0))) || (d < 0)) {
      throw new java.io.IOException("Invalid character in Base64 string");
    }
    out[outOffset] = (byte)(((a << 2) & 252) | ((b >>> 4) & 3));
    if (pad < 2) {
      out[outOffset + 1] = (byte)(((b << 4) & 240) | ((c >>> 2) & 15));
      if (pad < 1) {
        out[outOffset + 2] = (byte)(((c << 6) & 192) | (d & 63));
      }
    }
  }

  static  {
    int i;
    int i1;
    char[] ALPHABET__={65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,43,47};
    ALPHABET = ALPHABET__;
    valueDecoding = new int[128];
    i = 0;
    while (i < valueDecoding.length) {
      valueDecoding[i] = -1;
      i++;
    }
    i1 = 0;
    while (i1 < ALPHABET.length) {
      valueDecoding[ALPHABET[i1]] = i1;
      i1++;
    }
  }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.