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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Беззнаковый тип, unsigned типы в j2ME 
:(
    Опции темы
newinfo2005
  Дата 28.11.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем. Есть небольшая проблемка, гружу из сети поток байтов, а потом его разбираю, но появилась не большая проблемка пытаюсь из массива byte[] построить типа long , но не точный результат получается, когда передается значение байта больше 127..... я хотел бы сделать из знакового byte , беззнаковый byte, да и вообще как из знаковых типов сделать беззнаковые типы? наподобие как в Си++ 
unsigned long; ?
Спасибо заранее
PM MAIL ICQ   Вверх
newinfo2005
  Дата 28.11.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

public long ReadPacket32()
{
long data = 0;
long tmp = 0;
data = data_all[cursor+3]<0?255-(data_all[cursor+3]+1):data_all[cursor+3];
data <<=24;
tmp = data_all[cursor+2]<0?255-(data_all[cursor+2]+1):data_all[cursor+2];
data += (tmp<<16);
tmp = data_all[cursor+1]<0?255-(data_all[cursor+1]+1):data_all[cursor+1];
data += (tmp<<8);
data += data_all[cursor]<0?255-(data_all[cursor]+1):data_all[cursor];
cursor+=4;
return data;
}

решил времено проблему , но это не все , как все-таки по-другому можно?
PM MAIL ICQ   Вверх
eugine_s
Дата 29.11.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему бы не попробовать с другой стороны решить проблему.

Почему нельзя записывать DataOutputStream.writeLong() в файл, от куда потом будут записываться даные в data_all ? и тогда data_all буду наполняться как DataInputStream.readLong();


И еще один момент:

Цитата(newinfo2005 @  28.11.2008,  23:10 Найти цитируемый пост)
255-(data_all[cursor+3]+1)

это дает правильный результат? 

может все таки: 

data_all[cursor+3]<0?256 + data_all[cursor+3]:data_all[cursor + 3];
PM MAIL   Вверх
newinfo2005
Дата 29.11.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



eugine_s, а точно просто уже все заработало, а результат и правда неверный был, скрытый баг, уже спать хотел просто smile все-таки
Цитата

Почему нельзя записывать DataOutputStream.writeLong() в файл, от куда потом будут записываться даные в data_all ? и тогда data_all буду наполняться как DataInputStream.readLong();

ну я над этим думал, хотелось бы не извращаться так сильно
PM MAIL ICQ   Вверх
Platon
Дата 29.11.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(newinfo2005 @  29.11.2008,  18:38 Найти цитируемый пост)
хотелось бы не извращаться так сильно 

И это пишет человек, который вместо 1 строчки readLong пишет свой метод, предлагает не извращаться так сильно  smile 


Я думаю, вам всё-таки стоит глянуть в сторону readLong/writeLong или написать в чем заключается извращение?
PM MAIL ICQ   Вверх
newinfo2005
Дата 30.11.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Platon,   ээээ.... для меня извращением было создавать файл.... вот как Вы бы это сделали? код если мона
просто создавать для такого случая..... вообщем пока решил проблему своими методами smile

Это сообщение отредактировал(а) newinfo2005 - 30.11.2008, 00:49
PM MAIL ICQ   Вверх
Platon
Дата 30.11.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



newinfo2005, DataInputStream работает не только с файлами, но вообще с любыми потоками байт.
Код

DataInputStream is = new DataInputStream(socket.getInputStream());
long longVal = is.readLong();

PM MAIL ICQ   Вверх
math64
Дата 1.12.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В зависимости от порядка байт в потоке:
Код

long getUint32HighByteFirst(byte[] data, int index) {
return ((long)(data[index]&0xFF)<<24) | ((data[index+1]&0xFF)<<16) | ((data[index+2]&0xFF)<<8) | (data[index+3]&0xFF);
}
long getUint32LowByteFirst(byte[] data, int index) {
return ((long)(data[index+3]&0xFF)<<24) | ((data[index+2]&0xFF)<<16) | ((data[index+1]&0xFF)<<8) | (data[index]&0xFF);
}

readLong работает, если данные записаны writeLong, считывает 8 байт начиная со старшего (long в Java 64 бита).

Это сообщение отредактировал(а) math64 - 1.12.2008, 10:26
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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