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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совсем запутался в [] байтов... 
:(
    Опции темы
torreador
Дата 18.12.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. У меня появилась проблема, и нет у меня на нее решения =( хотя.. может я все переоцениваю....

В общем вот - 
Есть массив байт, произвольной длинны... мне его нужно разделить на несколько массивов(если это необходимо), по определенному количеству байт, произвести какую-либо манипуляцию с ним и обратно склеить.

Массивы могут приходить из потока, количество их в заранее не известно..

попытки своей реализации даже выкладывать не буду.. у меня там страх... пытался даже через ByteArray(Input \ Output)Stream сделать..

Как решить такую задачу?)
Может все просто до ужаса, но я в ауте... мозг уже совсем не варит =( Прошу помощи!


PM MAIL   Вверх
dorogoyIV
Дата 18.12.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

public class Test
{
 public static void main(String [] args)
 {
  String s = "Hello World";
  byte [] b = s.getBytes(); // не знаю откуда берешь начальный масив,
                            // поэтому напишу так  

  showArr(b); // смотрим на начальный масив
  System.out.println("\n");

  byte [][] bytes = partition(b, 3); // делим массив на несколько
  showDuArr(bytes); // смотрим на разделенный масив
  System.out.println("\n");

  byte [] unite_arr = uniteArrs(bytes); // склеиваем несколько масивов
  showArr(unite_arr); // смотрим на склеенный массив
 }

 // разделим исходный масив на несколько масивов
 // это тоже самое, что двумерный масив
 private static byte [][] partition(byte [] b, int size)
 {
  int count = b.length / size + 1;
  byte [][] bytes = new byte [count][];

  for(int i = 0, k = 0; i < bytes.length; i++)
  {
   if(b.length - size * i < size)
    bytes [i] = new byte [b.length % size];
   else
    bytes [i] = new byte [size];

   for(int j = 0; j < size & k < b.length; j++)
   {
    bytes [i][j] = b [k];
    k++;
   }
  }
  return bytes;
 }

 private static byte [] uniteArrs(byte [][] b)
 {
  int length = 0;

  for(int i = 0; i < b.length; i++)
   length += b [i].length;

  byte [] arr = new byte [length];

  for(int i = 0, k = 0; i < b.length; i++)
   for(int j = 0; j < b [i].length; j++, k++)
    arr [k] = b [i][j];

  return arr;
 }

 private static void showDuArr(byte [][] b)
 {
  for(int i = 0; i < b.length; i++)
  {
   for(int j = 0; j < b [i].length; j++)
    System.out.print(b [i][j] + " ");

   System.out.println();
  }
 }

 private static void showArr(byte [] b)
 {
  for(int i = 0; i < b.length; i++)
   System.out.print(b [i] + " ");

  System.out.println();
 }
}

PM MAIL   Вверх
PenDaLegi
Дата 18.12.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.12.2010
Где: Москва

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



Ну или так
Код


import java.util.ArrayList;
import java.util.Arrays;

public class myArray extends ArrayList {

    private myArray(Byte[] startArray) {
        super();
        this.addAll(Arrays.asList(startArray));
    }

    /**
     * Разбивает массив array на подмассивы длинной length
     * @param array исходный массаи
     * @param length длинная подмассива
     * @return подмассивы, как ArrayList
     */
    public static ArrayList<myArray> split(Byte[] array, int length) throws IllegalArgumentException{
        if (length<=0){
            throw new IllegalArgumentException("Неверное значение длины");
        }
        ArrayList<myArray> temp = new ArrayList<myArray>();
        int from = 0;
        int to = length;
        while (to < array.length) {
            temp.add(new myArray(Arrays.copyOfRange(array, from, to)));
            from=to;
            to+=length;
        }
        if(to>array.length-1){            
            temp.add(new myArray(Arrays.copyOfRange(array, from, array.length)));
        }
        return temp;
    }

    /**
     * Собирает подмассивы обратно
     * @param list список подмассивов
     * @return массив байтов
     */
    public static Byte[] build(ArrayList<myArray> list) {
        ArrayList<Byte> temp = new ArrayList<Byte>();
        for(myArray item: list){
            temp.addAll(item);
        }
        Byte[] data = temp.toArray(new Byte[temp.size()]);
        return data;
    }

    /**
     * Преобразование, которое нужно выполнить
     */
    public void doShomshingWithMe() {
        //
    }
}


пример использования
Код

    public static void main(String[] args) {
        Byte[] ar={1,2,3,4,5,6,7,8,9,0};
        ArrayList<myArray> temp = myArray.split(ar, 4);    
        for (myArray item: temp){
            item.doShomshingWithMe();
        }
        Byte[] result = myArray.build(temp);
    }

PM MAIL   Вверх
torreador
Дата 18.12.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Низкий всем поклон! Огромное спасибо!

Есть маленький вопрос:
Что если это реализовать на вх\исх потоках данных? Чувствую проигрыш в производительности будет, но вопрос не ударит в нос =))
Не выпендриваюсь, просто серверок очень маленький(собрали за 8 рублёв), на нем бд и програмка.. да еще и данные шифровать нужно.. боюсь повесится наш серверок))
PM MAIL   Вверх
PenDaLegi
Дата 18.12.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.12.2010
Где: Москва

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



Цитата(torreador @ 18.12.2010,  20:35)
Низкий всем поклон! Огромное спасибо!

Есть маленький вопрос:
Что если это реализовать на вх\исх потоках данных? Чувствую проигрыш в производительности будет, но вопрос не ударит в нос =))
Не выпендриваюсь, просто серверок очень маленький(собрали за 8 рублёв), на нем бд и програмка.. да еще и данные шифровать нужно.. боюсь повесится наш серверок))

Сложно дать дельный комментарий, все зависит от контекста задачи. Что именно за потоки, какова частота вызова алгоритма, какова ожидаемая нагрузка сервера... 
Кроме того, выбрав J2EE как платформу, нужно быть готовым к тому что требования к ресурсам выше чем у большинства других платформ. 

PM MAIL   Вверх
dorogoyIV
Дата 18.12.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



если под мой код подстраиваться, и большой поток данных, то лучше отдельный Thread запустить, и давать моему коду кусками.
а вообще, конечно есть другие способы работы с большими потоками.
тогда тебе в другую подкатегорию Java на этом форуме, как советует PenDaLegi, J2EE
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




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


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

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