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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как собрать double из 8 байт? 
V
    Опции темы
newbie5
Дата 21.1.2009, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мне с порта приходит значение типа double, разбитое по байтам. не могу его собрать обратно. подобной функции стандартной не нашел. сам как написать не представляю. в с++ это можно было сделать через указатели. в яве черт его знает)) есть некая функция readDouble для ObjectInputStream. но у меня почему-то не получается получить этот объектный поток из InputStream. помогите решить проблемку. любым способом)
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно приводить каждый байт к цифре и сдвигать на опредленное количество бит.
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



можешь поконкретнее описать? куда записывать принятые байты в переменные какого типа? и каким образом объединять? я не очень понял схему
PM MAIL   Вверх
rygel
Дата 21.1.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



взгляни на методы класс java.io.Bits. твоему классу он недоступен, но реализацию конвертирования можно оттуда взять.
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Предположим, что у тебя есть массив из четырех байт - byte b[4];

Код

public class Shift 
{
  public static void main(String[] args) {
    byte b[] = new byte[4];  // уже где-то определено
    int a = 0;
    for(int i=0; i<4; i++) {
      b[i]=1;   // Это просто от балды цифра
      int tmp = b[i];
      tmp = tmp << 8*i;
      System.out.println(i+":"+tmp);
      a += tmp;
      System.out.println(a);
    }
  }

}


PM MAIL   Вверх
AlexeyVorotnikov
Дата 21.1.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

Double.longBitsToDouble(long)

Как собрать long из 8 байтов рассказывать не буду, это элементарно smile


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ecologist @ 21.1.2009, 11:02)
Код
public class Shift  {
    public static void main(String[] args) {
        byte b[] = new byte[4];  // уже где-то определено
        int a = 0;
        for(int i=0; i<4; i++) {
            b[i]=1;   // Это просто от балды цифра
            int tmp = b[i];
            tmp = tmp << 8*i;
            System.out.println(i+":"+tmp);
            a += tmp;
            System.out.println(a);
        }
    }
}


Код
a += tmp;

неверный оператор на мой взгляд. здесь как я понимаю должно быть побитовое или. а его нельзя использовать для дабла... трабла...


Цитата(AlexeyVorotnikov @ 21.1.2009,  10:31)
Код

Double.longBitsToDouble(long)

Как собрать long из 8 байтов рассказывать не буду, это элементарно smile

long я сейчас пытался собрать таким же методом сдвига побитового. в этом случае твоя функция выдает непонятное мне "NaN"... я неправильно собираю лонг? думается, какой бы они ни был, эта функция должна по идее выдать дабл, пусть и неправильный.


а почему java.io.Bits. недоступен?

Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:04
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(newbie5 @  21.1.2009,  10:50 Найти цитируемый пост)
неверный оператор на мой взгляд. здесь как я понимаю должно быть побитовое или.

Тебе же сказали - это сдвиг на 8 бит. Каждый байт сдвигается все дальше и дальше. Учите матчасть, блин. RTFM.

Добавлено через 2 минуты и 39 секунд
Упс. Только что прочитал внимательно - надо double. Уф, там же мантисса какая-то есть и прочая дребедень. Приношу свои извинения.

Хотя я не очнеь понимаю, почему так надо через задницуделать - неужели надо передавать именно побайтно ?
PM MAIL   Вверх
rygel
Дата 21.1.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



недоступен потому что его уровень доступа  - package. но в нем реализованы методы для конвертирования массива байт в примитивные типы и наоборот.  конкретно по double:


Код

static double getDouble(byte[] b, int off) {
    long j = ((b[off + 7] & 0xFFL) << 0) +
         ((b[off + 6] & 0xFFL) << 8) +
         ((b[off + 5] & 0xFFL) << 16) +
         ((b[off + 4] & 0xFFL) << 24) +
         ((b[off + 3] & 0xFFL) << 32) +
         ((b[off + 2] & 0xFFL) << 40) +
         ((b[off + 1] & 0xFFL) << 48) +
         (((long) b[off + 0]) << 56);
    return Double.longBitsToDouble(j);
    }

PM MAIL   Вверх
newbie5
Дата 21.1.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ecologist @ 21.1.2009,  11:02)
Упс. Только что прочитал внимательно - надо double. Уф, там же мантисса какая-то есть и прочая дребедень. Приношу свои извинения.

Хотя я не очнеь понимаю, почему так надо через задницуделать - неужели надо передавать именно побайтно?

устройство передает именно побайтно.

с другой стороны побитовый сдвиг должен работать. нужно только догнать как из этих сдвиговых собрать результат. любое значение - поток нулей и единиц. хз почему | не работает



Цитата(rygel @ 21.1.2009, 11:09)
Код

static double getDouble(byte[] b, int off) {
    long j = ((b[off + 7] & 0xFFL) << 0) +
         ((b[off + 6] & 0xFFL) << 8) +
         ((b[off + 5] & 0xFFL) << 16) +
         ((b[off + 4] & 0xFFL) << 24) +
         ((b[off + 3] & 0xFFL) << 32) +
         ((b[off + 2] & 0xFFL) << 40) +
         ((b[off + 1] & 0xFFL) << 48) +
         (((long) b[off + 0]) << 56);
    return Double.longBitsToDouble(j);
    }


вот оно то, чего не хотел говорить AlexeyVorotnikov smile))


Код
    public void ReadAll() {
        long temp;
        double result;
        byte b[]=new byte[8];
        try{
            for (int a=0;a<8;a++) {
                if (inputStream.available()>0) {
                    b[a]=(byte)inputStream.read();
                } else {
                    System.out.println("buffer is empty");
                }
            }
        } catch (IOException e) {
            System.out.println(e);
        }
        temp = ((b[7] & 0xFFL) << 0) +
            ((b[6] & 0xFFL) << 8) +
            ((b[5] & 0xFFL) << 16) +
            ((b[4] & 0xFFL) << 24) +
            ((b[3] & 0xFFL) << 32) +
            ((b[2] & 0xFFL) << 40) +
            ((b[1] & 0xFFL) << 48) +
            (((long)b[0]) << 56);
        result=Double.longBitsToDouble(temp);
        System.out.println(result);
    }


что может работать неправильно? может быть дело в том что байты приходят беззнаковые, а таких в яве нет?

Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:29
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дело может быть в том, что представление вещественного числа гораздо сложнее, чем обычного целого.

http://www.intuit.ru/department/se/pbmsu/2/2.html


В языке Си вещественным числам соответствуют типы float и double. Элемент типа float занимает 4 байта, в которых один бит отводится под знак, восемь - под порядок, остальные 23 - под мантиссу (на самом деле, в мантиссе 24 разряда, но старший разряд всегда равен единице, поэтому хранить его не нужно). Тип double занимает 8 байтов, в них один разряд отводится под знак, 11 - под порядок, остальные 52 - под мантиссу. На самом деле в мантиссе 53 разряда, но старший всегда равен единице и поэтому не хранится. Поскольку порядок может быть положительным и отрицательным, в двоичном коде он хранится в смещенном виде: к нему прибавляется константа, равная абсолютной величине максимального по модулю отрицательного порядка. В случае типа float она равна 127, в случае double - 1023. Таким образом, максимальный по модулю отрицательный порядок представляется нулевым кодом. 
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ecologist @ 21.1.2009,  11:37)
Дело может быть в том, что представление вещественного числа гораздо сложнее, чем обычного целого.

хочешь сказать на с и на яве эти типы устроены по-разному? прошива на плате сишная..

Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:43
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему бы и нет ? Да даже если одинакого - ты же все равно получаешь поток байт, из которых надо собрать вещественное - а оно, как уже говорилось выше, гораздо сложнее устроено, чем целое.

Это сообщение отредактировал(а) ecologist - 21.1.2009, 11:44
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хз. если устройство одинаковое, то можно как в битовый поток перевести, так и из него обратно преобразовать. каждый дабл будет тождественным своим 64 битам. я так считаю

Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:54
PM MAIL   Вверх
ecologist
Дата 21.1.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(newbie5 @  21.1.2009,  11:52 Найти цитируемый пост)
каждый дабл будет тождественным своим 64 битам. я так считаю

Конечно так - каждый дабл состоит из 8 байтов. Но эти байты деляться на знак, степень и мантиссу - в тех соотношениях, которые я описал выше. Ну пришли такие замечательные 8 байтов - их надо парсить и делать из них дабл.

В принципе можно поробовать прямо из потока читать думая, что это сериализованное число, но что из этого выйдет - не знаю. 
Например Double - он сериализуемый и потому должен укладываться в поток и оттуда читаться - но т.к. укладывает не Java, а что-то другое, то фиг его знает, что там будет.
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в коде есть косяки? на твой взгляд? или все дело в различии кодирования?
PM MAIL   Вверх
math64
Дата 21.1.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



C++  скорее всего передает байты начиная с младшего, попробуй так:
Код

static double getDouble(byte[] b, int off) {
    long j = ((b[off + 0] & 0xFFL) << 0) +
         ((b[off + 1] & 0xFFL) << 8) +
         ((b[off + 2] & 0xFFL) << 16) +
         ((b[off + 3] & 0xFFL) << 24) +
         ((b[off + 4] & 0xFFL) << 32) +
         ((b[off + 5] & 0xFFL) << 40) +
         ((b[off + 6] & 0xFFL) << 48) +
         ((b[off + 7] & 0xFFL) << 56);
    return Double.longBitsToDouble(j);
    }

PM   Вверх
newbie5
Дата 21.1.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.1.2009,  12:30)
C++  скорее всего передает байты начиная с младшего

не зачем), я на каждый способ каждый раз проверяю обратную последовательность байт. спасиб, конечно, за помощь
PM MAIL   Вверх
math64
Дата 21.1.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если есть возможность выбрать передаваемое число, попробуй передать Пи (или какое нибудь другое число) и разпечатай принятые байты и разпечатай байты того же числа из Java, функция обратного перобразования - Double.doubleToLongBits(value) и сравни их (младшие биты могут быть разными из-за округления)
PM   Вверх
newbie5
Дата 21.1.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.1.2009,  12:47)
Если есть возможность выбрать передаваемое число, попробуй передать Пи ..

дельно. но это можно будет сделать только завтра.

вот еще мысль. знач с++ пилит дабл на байты и отправляет. есть разница, знаковые она отправляет или беззнаковые??
PM MAIL   Вверх
math64
Дата 21.1.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ты делаешь знаковые байты беззнаковыми с помощью маскирования  - b[off] & 0xFFL
PM   Вверх
ivg
Дата 21.1.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(newbie5 @  21.1.2009,  09:26 Найти цитируемый пост)
в яве черт его знает)) есть некая функция readDouble для ObjectInputStream. но у меня почему-то не получается получить этот объектный поток из InputStream.

Для справки:
Код

    public void ReadAll() throws IOException {
        double result;
        DataInputStream dis = new DataInputStream(inputStream);
        try {
            result = dis.readDouble();
        } catch (EOFException e) {
            e.printStackTrace();
            return;
        }
        System.out.println(result);
        ...
    }

PM MAIL   Вверх
newbie5
Дата 21.1.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо за вариант. все работает без ошибок, только опять не то значение получаю. хз где косяк. я за седня столько даблов получил.. ###)))
PM MAIL   Вверх
newbie5
Дата 21.1.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.1.2009,  12:47)
Если есть возможность выбрать передаваемое число, попробуй передать Пи (или какое нибудь другое число) и разпечатай принятые байты и разпечатай байты того же числа из Java, функция обратного перобразования - Double.doubleToLongBits(value) и сравни их (младшие биты могут быть разными из-за округления)

помоги плиз получить массив байт из Double.doubleToLongBits(value)

Код

        for (int a=0;a<8;a++) {
            b[a]=(byte)((ln>>a*8)&0xff);
        }


??

Это сообщение отредактировал(а) newbie5 - 21.1.2009, 14:14
PM MAIL   Вверх
math64
Дата 21.1.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

byte[] getBytes(double value) {
byte[] res = new byte[8];
long longBits = Double.doubleToLongBits(value);
for (int i = 0; i < 8; i++)
  res[i/* или 7 - i */] = (byte)(longBits >> (8 * i))
return res;
}


Добавлено через 6 минут и 9 секунд
Для распечатки можно и так:
Код

long longBits = Double.doubleToLongBits(value);
System.out.println(Long.toHexString(longBits));

каждому байту будет соответствовать 2 цифры (но ведущие нули будут опущены)
PM   Вверх
newbie5
Дата 21.1.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.1.2009,  14:08)
Добавлено @ 14:15
Для распечатки можно и так:
Код

long longBits = Double.doubleToLongBits(value);
System.out.println(Long.toHexString(longBits));

каждому байту будет соответствовать 2 цифры (но ведущие нули будут опущены)

тупые вопросы порой задаю, спасибо за ответы на них. это подчас самое сложное. особенно когда ступор. каюсьsmile
PM MAIL   Вверх
newbie5
Дата 22.1.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @ 21.1.2009,  12:47)
Если есть возможность выбрать передаваемое число, попробуй передать Пи (или какое нибудь другое число) и разпечатай принятые байты и разпечатай байты того же числа из Java, функция обратного перобразования - Double.doubleToLongBits(value) и сравни их (младшие биты могут быть разными из-за округления)

байтовые массивы получаются абсолютно разными. плюс то, что несколько различных методов дают одинаковый результат, дает понять что косяки в отправке. нужно видимо ее таким же образом реализовать. подскажите пожалста аналоги функций Double.longBitsToDouble(mylongbits) и Double.doubleToLongBits(var) на си..
PM MAIL   Вверх
math64
Дата 22.1.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Приведи примеры этих байтовых массивов - совсем разными они быть не могут (можешь попробовать раcпечатать в двоичном виде чтобы понять различия).
В С++ в аналогах longBitsToDouble/doubleToLongBits нет необходимости:
Код

unsigned char bytes[8];
double d = *(double*)bytes;

PM   Вверх
newbie5
Дата 22.1.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как распечататься в двоичном виде?
PM MAIL   Вверх
math64
Дата 22.1.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

Long.toBinaryString(longBits);

PM   Вверх
newbie5
Дата 22.1.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как можно посмотреть функции longBitsToDouble/doubleToLongBits? отправляющиеся байты, и байты, которые должны отправляться, уж слишком разные.

процедура отправки в упрощенном виде выглнядит следующим образом:
Код

double z=3.14;
char bytes[8];
*(double*)bytes=z;
for (int i=0; i<8;i++) {
        if ((U0LSR & 0x20)==0x20) {
            U0THR=bytes[i];
        } else {
            i--;
        }
    }


если выводить знаковые байты получается приблизительно следующее:

 64  9  30  -72  81   -12  -123  31  - должно быть
-72 30   9   64  31  -123   -21  81  - приходит

логика, конечно, налюдается наблюдается, но почему так получается - непонтяно

Это сообщение отредактировал(а) newbie5 - 22.1.2009, 14:09
PM MAIL   Вверх
math64
Дата 22.1.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



"В должно быть" не -12, а -21.
Очевидно, в твоём микропроцессоре есть порядок байт в short (int16) и int (int32) - младший байт вперёд, а int64 он аппаратно не поддерживает. Программисты, писавшие библиотеку для double разместили сначала старший int32, а затем младший.
Нужно переставить байты или в C++, чтобы в Java можно было применить DataInputStream, или в Java:
Код

double getDouble(byte[] data) {
long longBits =
  ( (data[3] & 0xFFL) << 56)  |
  ( (data[2] & 0xFFL) << 48)  |
  ( (data[1] & 0xFFL) << 40)  |
  ( (data[0] & 0xFFL) << 32)  |
  ( (data[7] & 0xFFL) << 24)  |
  ( (data[6] & 0xFFL) << 16)  |
  ( (data[5] & 0xFFL) << 8)  |
  ( (data[4] & 0xFFL) << 0) ;
return Double.longBitsToDouble(longBits);
}


Это сообщение отредактировал(а) math64 - 22.1.2009, 14:49
PM   Вверх
newbie5
Дата 22.1.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо всем огромное. тема, видимо, закрыта)
PM MAIL   Вверх
Beni
Дата 11.3.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Function for conversion of an 8 byte array to double: 
    public static double arr2double (byte[] arr, int start) {
        int i = 0;
        int len = 8;
        int cnt = 0;
        byte[] tmp = new byte[len];
        for (i = start; i < (start + len); i++) {
            tmp[cnt] = arr[i];
            //System.out.println(java.lang.Byte.toString(arr[i]) + " " + i);
            cnt++;
        }
        long accum = 0;
        i = 0;
        for ( int shiftBy = 0; shiftBy < 64; shiftBy += 8 ) {
            accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy;
            i++;
        }
        return Double.longBitsToDouble(accum);
    }


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

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

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


 




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


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

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