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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как собрать double из 8 байт? 
V
    Опции темы
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.

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


 




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


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

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