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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Жава приведение byte[]-> long, Помогите осуществить 
V
    Опции темы
zone51
Дата 9.12.2006, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Помогите пожалуйста осуществить приведение байтового массива в тип лонг ну или инт. Огромное спасибо. smile 


--------------------
The truth is out there
PM MAIL   Вверх
Alexandr87
Дата 9.12.2006, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



что конкретно подразумевается под приведением?

Вобщем, как я понял, самое логичное - это приведение типа такого:

{0x03,0x10,0x20} -> 3*256^2 + 16*256 + 32 = 200736.

Если, это так, то написать программу подобного приведения не составит труда, но нужно более подробно определиться, как будет представлятся знак "минус" (можно выделить дополнительный байт).

Нужны дополнения, что именно подразумевается под "приведение".

Добавлено @ 06:52 
Код


public class Main {

    public static void main(String[] args) throws Exception {
        byte in[] = {0x03, 0x10, 0x20};
        
        long out = convert(in);
        System.out.println(out);
        
        
    }
    
    public static long convert(byte in[]) {
        long res = 0;
        
        for (int i=0; i<in.length; i++) {
            res+=in[in.length-1-i]*Math.pow(256,i);
        }
        return res;
    }
    
}


Это сообщение отредактировал(а) Alexandr87 - 9.12.2006, 06:53
PM Jabber   Вверх
Platon
Дата 9.12.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alexandr87, думаю степени лучше заменить на сдвиги, производительней будет.
Код

public static long convert(byte in[]) {
        long res = 0;
        for (int i=0; i<in.length; i++) {
            res |= ((long)in[i]) << (i << 8);
        }
        return res;
    }


и смотря где у нас старше разряд так и делаем. Если {0x03, 0x10, 0x20} старший разряд левее, то в скобках пишем ((long)in[in.length-1-i]), а если старший разряд правее, то ((long)in[i]).
PM MAIL ICQ   Вверх
LSD
Дата 9.12.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Оба этих метода неправильно работают:
Код
byte[] data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01};
System.out.printf("0x%016X", convert(data));



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Alexandr87
Дата 9.12.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(LSD @ 9.12.2006,  15:33)
Оба этих метода неправильно работают:
Код
byte[] data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01};
System.out.printf("0x%016X", convert(data));

да уж - погнал я немного  с типами - забыл что byte (-128..127).

Тогда есть два выхода - самому интерпретировать отрицательные значения - и переводить их в соответсвующие положительные, либо просто взять тип с длиной побольше. На мой взгляд второй вариант лучше.



Типа того
Код

public class Main {

    public static void main(String[] args) throws Exception {
        short[] data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
        
        System.out.println(convert(data));
    }
    
    public static long convert(short in[]) {
        long res = 0;
        
        for (int i=0; i<in.length; i++) {
            res+=Math.abs(in[in.length-1-i])*Math.pow(256,i);
        }
        return res;
    }
    
}



PM Jabber   Вверх
zone51
Дата 9.12.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Alexandr87, 
LSD, 
Platon, 
 Спасибо Вам огромное что откликнулись, но у меня задача такая: числа положительные, и есть бинарный файл в котором находятся структуры С. Мне эти структуры надо по байтам запихнуть в ява классы. То есть есть структура в ней поля допустим типа лонг, чар и сшорт.
Так вот моя прога считывает из файла блоки 4,1,2 байта, всего 7 байт блок, и загоняет в поля классов. Причем очень желательно реализовать считывание именно байт из файла а не сразу чисел-нужно сохранить наглядность smile. Вот и для этого надо соб-но перегон  Спасибо. 


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 10.12.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Alexandr87 @  9.12.2006,  17:35 Найти цитируемый пост)
Тогда есть два выхода - самому интерпретировать отрицательные значения - и переводить их в соответсвующие положительные, либо просто взять тип с длиной побольше. На мой взгляд второй вариант лучше.

Вовсе нет, надо просто делать b[i] & 0xFF. Посмотри код методов в DataOutputStream.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
shimopus
Дата 10.12.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Прошу прощения за небольшой оффтоп, но уже во второй ветке появляется это магическое b[i] & 0xFF. Расскажите, плиз поподробнее зачем это надо.
PM ICQ Skype GTalk   Вверх
Alexandr87
Дата 10.12.2006, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(shimopus @  10.12.2006,  03:43 Найти цитируемый пост)
Прошу прощения за небольшой оффтоп, но уже во второй ветке появляется это магическое b[i] & 0xFF. Расскажите, плиз поподробнее зачем это надо. 


все операции которые укладываются в int,  делаются в int. В байте один бит отвечает  за представление знака, операция &0xFF, ничего по сути не делает - выдает ту же последовательность бит, что и была в байте, вот тока теперь это интерпретируется как int, и соответственно бит, который отвечал за знак, теперь представляет дополнительный разряд числа.


Цитата(LSD @  10.12.2006,  03:40 Найти цитируемый пост)
Вовсе нет, надо просто делать b[i] & 0xFF

Так, что по-сути это и есть первый вариант - интерпретация (только умный,  я что-то про него не подумал).
PM Jabber   Вверх
alexsmirnov
Дата 12.12.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще-то все это реализовано в NIO - java.nio.ByteBuffer , и всякие LongBuffer, IntBuffer etc.
PM MAIL   Вверх
LSD
Дата 12.12.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(alexsmirnov @  12.12.2006,  14:36 Найти цитируемый пост)
Вообще-то все это реализовано в NIO - java.nio.ByteBuffer , и всякие LongBuffer, IntBuffer etc.

Только создавать новый LongBuffer или IntBuffer ради одного long-а или int-а, не целесообразно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 15.12.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



LSD, 
Большое спасибо Вам и всем кто откликнулся. Сделал сдвигами-все просек-пойдет.
Терь немножко другая проблема-отдельную тему не захотел заводить ибо много. smile 
Есть класс и в нем описано поле типа char[] то есть массив из сколько то там элементов.
надо написать для него гет метод. Но вот в чем фишка. Ведь такое не прокатит:
Код

char[] getField(){
 return Field;
}

Что то мне такой код не нравится. Как правильно? Спасибо.


--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 15.12.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(zone51 @ 15.12.2006,  00:03)
Есть класс и в нем описано поле типа char[] то есть массив из сколько то там элементов.
надо написать для него гет метод. Но вот в чем фишка. Ведь такое не прокатит:
Код

char[] getField(){
 return Field;
}

Что то мне такой код не нравится. Как правильно? Спасибо.

1. Почему не прокатит?
2. Чем именно не нравится?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
zone51
Дата 15.12.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



LSD, 
Ну  то что еще со школы укоренилось то что функция не может возвращать массив(из паскаля) а из института то что имя массива без индекса это первый элемент массива(из С++)



--------------------
The truth is out there
PM MAIL   Вверх
LSD
Дата 15.12.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. Функция может возвращать массив, и в Java это обычная практика
Код
"bla-bla-bla".toCharArray()

2. Имена полей в Java принято начинать с маленькой буквы.

P.S. Только учти одну вещь, массив в Java, это тоже объект и он передается по ссылке. Если ты получив массив начнешь записывать в него новые данные, то ты будешь менять и исходный массив тоже.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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