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


Автор: TieRR 26.3.2008, 13:20
Собственно, как это реализовать?

Автор: LSD 26.3.2008, 13:43
В простейшем случае:
Код

InputStream in;
DataInputStream dataIn = new DataInputStream(in);
double d = dataIn.readDouble();

Автор: TieRR 26.3.2008, 14:17
Сорри, не уточнил: чтение двоичного потока из бд. Вот код, который надо исправить:
Код

InputStream is = set.getBinaryStream("ADCdata");
      DataInputStream dis = new DataInputStream(is);
    data = new double[dis.available()/4];
      //   System.out.println("dis.available"+dis.available());    240 000

      int i=0;
      while(dis.available()>0){
        byte b1 = dis.readByte();
        byte b2 = dis.readByte();
        byte b3 = dis.readByte();
        byte b4 = dis.readByte();
          dis.skipBytes(4);
      data[i++] = Float.intBitsToFloat ((b4 & 0xff) << 24 | (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff);
         // data[i++]=dis.readFloat();
         // data[i++]=
          System.out.println("ento v adcdata data[i]"+data[i++]);
      }


Автор: LSD 26.3.2008, 15:44
1. Порядок байт какой?
2. Откуда берется InputStream совершенно без разницы, из БД, файла.
3. Что не так с этим кодом?

Автор: TieRR 26.3.2008, 15:55
Проблема в том, что после этих преобразований в массиве хранятся одни нули.

Автор: LSD 26.3.2008, 16:00
Почему там используется Float, ты же говорил что там лежат double?

Автор: TieRR 26.3.2008, 16:13
ну потому что только у флоата нашел такой метод преобразования битов...
Поэтому и вопрос  стоит о приведения к даблу, так как не знаю как)

Автор: LSD 26.3.2008, 16:18
А Double.longBitsToDouble() это что?

И чем тебя не устраивает тот способ, что я показал? Зачем нужен свой велосипед?

Автор: TieRR 26.3.2008, 16:24
так а в качестве параметра что использовать тогда?

Автор: LSD 26.3.2008, 16:45
Для начала прекрати изобретать велосипед и используй readDouble().

Автор: alexadr 26.3.2008, 17:10
Цитата(TieRR @ 26.3.2008,  15:55)
Проблема в том, что после этих преобразований в массиве хранятся одни нули.

Я бы просто подебажил ентот код, - пораспечатывал бы каждый байт в виде двоичной строки. Распечатал бы получившийся Integer который передается на методу Float.intBitsToFloat:

Код

        byte b = 5;
        System.out.println(Integer.toString(b, 2));

Автор: COVD 26.3.2008, 17:18
Категорически нельзя использовать available() для оценки количества данных. Данные из внешнего источника (база данных, удаленный сервер) могут загружаться частями. Соответственно, available() будет возвращать от 0 (вначале загрузки данных в стрим) до МАХ.

Не нужна проверка while(dis.available()>0) , потому что readByte - блокирующая операция (в документации явно не написано, но для чтения используется InputStream.read() - там написано, что блокирующая). Надо while(true) и выход из цикла по EOFException (нормальное завершение чтения) или IOException.

Метод readFloat делает тоже самое, что код автора топика (кроме конечно skipBytes(4) - это вообще зачем пропускать следующие 4 байта ? ):
       
Код

 byte b1 = dis.readByte();
        byte b2 = dis.readByte();
        byte b3 = dis.readByte();
        byte b4 = dis.readByte();
          dis.skipBytes(4);
       data[i++] = Float.intBitsToFloat ((b4 & 0xff) << 24 | (b3 & 0xff) << 16 | (b2 & 0xff) << 8 | b1 & 0xff);


какой смысл повторять readFloat, да еще с учетом skipBytes возможно неправильно?


Поскольку размер данных не известен, то заранее создавать массив data[] не получится - надо использовать динамическую коллекцию ( ArrayList<Float> например ).


Автор: TieRR 26.3.2008, 17:31
как я могу применять readdouble, когда там идет двоичный поток длиной в тысячи  байт???

Автор: alexadr 26.3.2008, 17:34
Ну так метод надо дергать в цикле readDouble(). 

Автор: LSD 26.3.2008, 17:37
Цитата(TieRR @  26.3.2008,  17:31 Найти цитируемый пост)
как я могу применять readdouble, когда там идет двоичный поток длиной в тысячи  байт???

Про циклы никогда не слышал? smile 

Код

  public static List<Double> readDoubles(InputStream in)
  {
    ArrayList<Double> list = new ArrayList<Double>();
    DataInputStream dataIn = new DataInputStream(in);
    try
    {
      while(true)
      {
        list.add(dataIn.readDouble());
      }
    }
    catch(IOException e)
    {
    }
    return list;
  }

Автор: TieRR 27.3.2008, 16:46
Всем спасибо, все заработало)

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