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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как собрать double из 8 байт? 
V
    Опции темы
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   Вверх
Страницы: (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.1300 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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