![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
мне с порта приходит значение типа double, разбитое по байтам. не могу его собрать обратно. подобной функции стандартной не нашел. сам как написать не представляю. в с++ это можно было сделать через указатели. в яве черт его знает)) есть некая функция readDouble для ObjectInputStream. но у меня почему-то не получается получить этот объектный поток из InputStream. помогите решить проблемку. любым способом)
|
|||
|
||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
Можно приводить каждый байт к цифре и сдвигать на опредленное количество бит.
|
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
можешь поконкретнее описать? куда записывать принятые байты в переменные какого типа? и каким образом объединять? я не очень понял схему
|
|||
|
||||
rygel |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 21.9.2007 Где: Харьков Репутация: 6 Всего: 7 |
взгляни на методы класс java.io.Bits. твоему классу он недоступен, но реализацию конвертирования можно оттуда взять.
|
|||
|
||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
Предположим, что у тебя есть массив из четырех байт - byte b[4];
|
|||
|
||||
AlexeyVorotnikov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 658 Регистрация: 18.6.2007 Где: Москва Репутация: 10 Всего: 18 |
Как собрать long из 8 байтов рассказывать не буду, это элементарно ![]() -------------------- RTFM! Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification |
|||
|
||||
newbie5 |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
неверный оператор на мой взгляд. здесь как я понимаю должно быть побитовое или. а его нельзя использовать для дабла... трабла...
long я сейчас пытался собрать таким же методом сдвига побитового. в этом случае твоя функция выдает непонятное мне "NaN"... я неправильно собираю лонг? думается, какой бы они ни был, эта функция должна по идее выдать дабл, пусть и неправильный. а почему java.io.Bits. недоступен? Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:04 |
||||||||||
|
|||||||||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
Тебе же сказали - это сдвиг на 8 бит. Каждый байт сдвигается все дальше и дальше. Учите матчасть, блин. RTFM. Добавлено через 2 минуты и 39 секунд Упс. Только что прочитал внимательно - надо double. Уф, там же мантисса какая-то есть и прочая дребедень. Приношу свои извинения. Хотя я не очнеь понимаю, почему так надо через задницуделать - неужели надо передавать именно побайтно ? |
|||
|
||||
rygel |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 21.9.2007 Где: Харьков Репутация: 6 Всего: 7 |
недоступен потому что его уровень доступа - package. но в нем реализованы методы для конвертирования массива байт в примитивные типы и наоборот. конкретно по double:
|
|||
|
||||
newbie5 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
устройство передает именно побайтно. с другой стороны побитовый сдвиг должен работать. нужно только догнать как из этих сдвиговых собрать результат. любое значение - поток нулей и единиц. хз почему | не работает
вот оно то, чего не хотел говорить AlexeyVorotnikov ![]()
что может работать неправильно? может быть дело в том что байты приходят беззнаковые, а таких в яве нет? Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:29 |
||||||||
|
|||||||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. Таким образом, максимальный по модулю отрицательный порядок представляется нулевым кодом. |
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
хочешь сказать на с и на яве эти типы устроены по-разному? прошива на плате сишная.. Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:43 |
|||
|
||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
А почему бы и нет ? Да даже если одинакого - ты же все равно получаешь поток байт, из которых надо собрать вещественное - а оно, как уже говорилось выше, гораздо сложнее устроено, чем целое.
Это сообщение отредактировал(а) ecologist - 21.1.2009, 11:44 |
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
хз. если устройство одинаковое, то можно как в битовый поток перевести, так и из него обратно преобразовать. каждый дабл будет тождественным своим 64 битам. я так считаю
Это сообщение отредактировал(а) newbie5 - 21.1.2009, 11:54 |
|||
|
||||
ecologist |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
Конечно так - каждый дабл состоит из 8 байтов. Но эти байты деляться на знак, степень и мантиссу - в тех соотношениях, которые я описал выше. Ну пришли такие замечательные 8 байтов - их надо парсить и делать из них дабл. В принципе можно поробовать прямо из потока читать думая, что это сериализованное число, но что из этого выйдет - не знаю. Например Double - он сериализуемый и потому должен укладываться в поток и оттуда читаться - но т.к. укладывает не Java, а что-то другое, то фиг его знает, что там будет. |
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
в коде есть косяки? на твой взгляд? или все дело в различии кодирования?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
C++ скорее всего передает байты начиная с младшего, попробуй так:
|
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
не зачем), я на каждый способ каждый раз проверяю обратную последовательность байт. спасиб, конечно, за помощь |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если есть возможность выбрать передаваемое число, попробуй передать Пи (или какое нибудь другое число) и разпечатай принятые байты и разпечатай байты того же числа из Java, функция обратного перобразования - Double.doubleToLongBits(value) и сравни их (младшие биты могут быть разными из-за округления)
|
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
дельно. но это можно будет сделать только завтра. вот еще мысль. знач с++ пилит дабл на байты и отправляет. есть разница, знаковые она отправляет или беззнаковые?? |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ты делаешь знаковые байты беззнаковыми с помощью маскирования - b[off] & 0xFFL
|
|||
|
||||
ivg |
|
||||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Для справки:
|
||||
|
|||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
спасибо за вариант. все работает без ошибок, только опять не то значение получаю. хз где косяк. я за седня столько даблов получил.. ###)))
|
|||
|
||||
newbie5 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
помоги плиз получить массив байт из Double.doubleToLongBits(value)
?? Это сообщение отредактировал(а) newbie5 - 21.1.2009, 14:14 |
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Добавлено через 6 минут и 9 секунд Для распечатки можно и так:
каждому байту будет соответствовать 2 цифры (но ведущие нули будут опущены) |
||||
|
|||||
newbie5 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
тупые вопросы порой задаю, спасибо за ответы на них. это подчас самое сложное. особенно когда ступор. каюсь ![]() |
||||
|
|||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
байтовые массивы получаются абсолютно разными. плюс то, что несколько различных методов дают одинаковый результат, дает понять что косяки в отправке. нужно видимо ее таким же образом реализовать. подскажите пожалста аналоги функций Double.longBitsToDouble(mylongbits) и Double.doubleToLongBits(var) на си.. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Приведи примеры этих байтовых массивов - совсем разными они быть не могут (можешь попробовать раcпечатать в двоичном виде чтобы понять различия).
В С++ в аналогах longBitsToDouble/doubleToLongBits нет необходимости:
|
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
как распечататься в двоичном виде?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
|
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
как можно посмотреть функции longBitsToDouble/doubleToLongBits? отправляющиеся байты, и байты, которые должны отправляться, уж слишком разные.
процедура отправки в упрощенном виде выглнядит следующим образом:
если выводить знаковые байты получается приблизительно следующее: 64 9 30 -72 81 -12 -123 31 - должно быть -72 30 9 64 31 -123 -21 81 - приходит логика, конечно, налюдается наблюдается, но почему так получается - непонтяно Это сообщение отредактировал(а) newbie5 - 22.1.2009, 14:09 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
"В должно быть" не -12, а -21.
Очевидно, в твоём микропроцессоре есть порядок байт в short (int16) и int (int32) - младший байт вперёд, а int64 он аппаратно не поддерживает. Программисты, писавшие библиотеку для double разместили сначала старший int32, а затем младший. Нужно переставить байты или в C++, чтобы в Java можно было применить DataInputStream, или в Java:
Это сообщение отредактировал(а) math64 - 22.1.2009, 14:49 |
|||
|
||||
newbie5 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 12.12.2008 Репутация: нет Всего: нет |
спасибо всем огромное. тема, видимо, закрыта)
|
|||
|
||||
Beni |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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); } |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |