![]() |
Модераторы: 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, а что-то другое, то фиг его знает, что там будет. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |