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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись произвольного количества байт из потока. 
V
    Опции темы
zzmeyz
Дата 23.3.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такая ситуация:

в файле хранится 4х байтное значение.
Считываю в массив последовательно эти 4 байта.

Вопрос как их собрать в одно значение?
PM MAIL   Вверх
Metal_Heart
Дата 23.3.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

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



самый простой способ:

Код

int i=byte1 + byte2*0x10 + byte3*0x100 + ...


Это сообщение отредактировал(а) Metal_Heart - 23.3.2006, 16:51


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
ALKS
Дата 23.3.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zzmeyz, а ты бы книжки почитать по-пробовал чтo-ли. Эккеля того же. а то вопросы типа преобразования типов и вот это. это даже не смешно. это удивительно.
PM   Вверх
Metal_Heart
Дата 23.3.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

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



при условии конечно, что byte1 - самый младший!


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
zzmeyz
Дата 23.3.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ALKS @ 23.3.2006, 13:44)
zzmeyz, а ты бы книжки почитать по-пробовал чтo-ли. Эккеля того же. а то вопросы типа преобразования типов и вот это. это  даже не смешно. это удивительно.

Доскональное изучение явы пока не входит в мои планы.
Так что не вижу смысла покупать или качать книги...
И к тому же эта проблема была последней, и дальнейшая работа с явой опять откладывается на неопределенный срок...
PM MAIL   Вверх
LSD
Дата 23.3.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Big-endian
Код
int i = ((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF);

Little-endian
Код
int i = ((data[3] & 0xFF) << 24) | ((data[2] & 0xFF) << 16) | ((data[1] & 0xFF) << 8) | (data[0] & 0xFF);



--------------------
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   Вверх
chief39
Дата 23.3.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

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



Metal_Heart, это чуть не то получиться smile так можно сделать если стринг с десятичным числом надо в инт перевести - такой алгоритм пойдёт.
Но в одном байте ведь не число от 0 до 10.


zzmeyz, Побитово - самое оптимальное.
пустой инт(=0),
потом берёшь старший байт, "прижигаешь его" побитовым умножением - (& 0xFF) и умножаешь побитово на свой инт. В инте, в нижних 8 битах - твой старший байт.
Потом с помощью битового сдвига << 8 поднимаешь это на 8 бит вверх.
берёшь следующий байт, прижигаешь и опять на инт... и сдвиг.
Так четыре раза. Только после последнего раза сдвиг не делай - верхнее вылезет за пределы инта, а внизу будет монотонная белиберда.

Так будет быстрее всего работать да и правильнее так.


Цитата(zzmeyz @ 23.3.2006, 13:55 Найти цитируемый пост)
И к тому же эта проблема была последней, и дальнейшая работа с явой опять откладывается на неопределенный срок...

Да ладно, я тоже не собирался ещё год назад на Яве программить smile Но ить ведь как жизнь повернулась smile Всё равно хорошая книга не помешает smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
zzmeyz
Дата 23.3.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(chief39)
Да ладно, я тоже не собирался ещё год назад на Яве программить smile Но ить ведь как жизнь повернулась smile Всё равно хорошая книга не помешает smile


Ладно, согласен smile
Уже качаю...

а проблема решилась так:

Код
 int start = (bmp_in[10])|(bmp_in[11]<<8)|(bmp_in[12]<<16)|(bmp_in[13]<<24);


Всем спасибо за участие.

Это сообщение отредактировал(а) zzmeyz - 23.3.2006, 15:18
PM MAIL   Вверх
LSD
Дата 23.3.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



У тебя неправильный код, он будет работать с ошибками если байт больше 127.
Код
byte[] data = {-1 , 2 , 3 , 4};
int k = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
System.out.println("0x" + Integer.toHexString(k).toUpperCase());



--------------------
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   Вверх
Metal_Heart
Дата 23.3.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

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



chief39, конечно!
я имел ввиду 0х10.. но почему-то не набрал smile


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
ALKS
Дата 23.3.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



эм smile а нельзя было это 4x байтовое значение сразу из файла считать в int? DataInputStream-ом, скажем?


PM   Вверх
LSD
Дата 23.3.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(ALKS @ 23.3.2006, 17:13 Найти цитируемый пост)
эм  а нельзя было это 4x байтовое значение сразу из файла считать в int? DataInputStream-ом, скажем?

В спецификации DataInputStream не говорится в каком порядке байт он читает, только что это machine-independent way. К тому же он требует InputStream, а создавть ради пары байт новый стрим не рационально.


--------------------
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   Вверх
chief39
Дата 24.3.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

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



Цитата(zzmeyz @ 23.3.2006, 15:05 Найти цитируемый пост)
а проблема решилась так:

Тебе LSD указал что там не так, а не так там из-за отсутствия того самого "прижигания", о котором я говорил.
Перед какими-либо операциями, всё что ниже инта, приводится к нему. То есть байт перегоняется в инт и потом уже побитно складывается. и если ты не наложишь такую маску, которая выделяет лишь нижний байт(твой) - будет лажа smile
Если ты сразу после после битового умножения запихиваешь в такой же размерности переменную - можно пренебречь(когда байт -> инт -> байт), верх срежется. А поскольку ты начинаешь двигать сей байт по инту и укладывать рядом бругие байты - то обязательно обрезание!!! эээ... нууу.. то есть прижигание smile)


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
mr.DUDA
Дата 24.3.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Гм... извиняюсь, а в Java разве нету аналога Stream.ReadByte() и беззнакового типа byte 0...255 ? smile


--------------------
user posted image
PM MAIL WWW   Вверх
LSD
Дата 25.3.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Аналог Stream.ReadByte() есть, а беззнаковых типов нет.


--------------------
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.0836 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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