Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Совсем запутался в [] байтов...


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

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

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

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

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


Автор: dorogoyIV 18.12.2010, 14:08
Код

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();
 }
}

Автор: PenDaLegi 18.12.2010, 14:16
Ну или так
Код


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);
    }

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

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

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

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

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

Автор: dorogoyIV 18.12.2010, 23:02
если под мой код подстраиваться, и большой поток данных, то лучше отдельный Thread запустить, и давать моему коду кусками.
а вообще, конечно есть другие способы работы с большими потоками.
тогда тебе в другую подкатегорию Java на этом форуме, как советует PenDaLegi, J2EE

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)