Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Запись произвольного количества байт из потока.


Автор: zzmeyz 23.3.2006, 13:38
Такая ситуация:

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

Вопрос как их собрать в одно значение?

Автор: Metal_Heart 23.3.2006, 13:44
самый простой способ:

Код

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

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

Автор: Metal_Heart 23.3.2006, 13:45
при условии конечно, что byte1 - самый младший!

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

Доскональное изучение явы пока не входит в мои планы.
Так что не вижу смысла покупать или качать книги...
И к тому же эта проблема была последней, и дальнейшая работа с явой опять откладывается на неопределенный срок...

Автор: LSD 23.3.2006, 14:37
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);

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


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

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


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

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

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


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

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

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


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

Автор: LSD 23.3.2006, 15:22
У тебя неправильный код, он будет работать с ошибками если байт больше 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());

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

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


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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)