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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class to byte[] 
V
    Опции темы
Ak47black
  Дата 20.5.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.
Вот такая ситуация
есть класс
Код

    public class TransportPacket
    {
        byte port;
        byte flag;
        short size;
        byte[] data;
    }

ищу функцию, которая-бы переводила-бы переменную структуры в byte[].
Как лучше сделать?

Другими словами делаю модель сетевых протоколов и мне нужно сначала заполнить структуру TransportPacket, а потом получить byte[] из этой структуры что-бы передать нижнему уровню.
PM MAIL   Вверх
dobrolub
Дата 20.5.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



hessian – удобный бинарный протокол. рекомендую. http://hessian.caucho.com/
PM   Вверх
Ak47black
Дата 20.5.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не я смысле сам пишу модель  smile

Добавлено через 58 секунд
Мне просто надо найти функцию на которую я подаю структуру [+ размер] и получаю byte[].

Добавлено через 4 минуты и 13 секунд
Хотя в принципе я могу сам это всё дело написать.
Я просто хотел-бы узнать что уже есть стандартное.
PM MAIL   Вверх
pathfinder
Дата 20.5.2010, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Стандартно для этого применяются ObjectOutputStream(Object -> byte[]) и ObjectInputStream(byte[] -> Object)

Только объекты обязательно должны быть помечены как сериализуемые, для этого достаточно указать, что класс реализует интерфейс Serializable.

Единственное что останется сделать - это реализовать OutputStream и InputStream.

Т.е. Object -> byte[] будет выглядеть так
Код

OutputStreamImpl os = new OutputStreamImpl(); // реализует интерфейс OutputStream
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(somePacket);
oos.flush();



Это сообщение отредактировал(а) pathfinder - 20.5.2010, 21:25
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А вот так как-то получится у меня сделать?
Код

    public abstract class Packet implements Serializable
    {
        short size;
    }

    public class TransportPacket extends Packet implements Serializable
    {
        byte port;
        byte flag;
        byte[] data;
    }

И сама функция
Код

    public byte[] getBytes(Packet packet)
    {
        byte[] outdata = new byte[packet.size];
        System.arraycopy(packet, 0, outdata, 0, packet.size);
        return outdata;
    }

При выполнении
вот тут
Код

System.arraycopy(packet, 0, outdata, 0, packet.size);

получаю 
Цитата

java.lang.ArrayStoreException


Функцию вызываю с 
Код

packet.port = 20;
packet.flag = 1;
packet.size = 4;
packet.data = null;


Добавлено через 4 минуты и 27 секунд
По идее 
Цитата

packet.port = 1 byte
packet.flag  = 1 byte
packet.size = 2 byte
packet.data = 0 byte
--------------------------
всего = 4 bytes


Это сообщение отредактировал(а) Ak47black - 20.5.2010, 21:40
PM MAIL   Вверх
pathfinder
Дата 20.5.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все решение задачи заключается в реализации OutputStream, например вот так
Код

public class MyOutputStream {
    
    public MyOutputStream(int bufferSize) {
        buffer = new byte[bufferSize];
    }
    
    public void flush() {}
    
    public void close() {}
    
    public void write(byte[] b) {
        write(b, 0, b.length);
    }
    
    public void write(byte[] b, int off, int len) {
        canWrite(len);
        System.arraycopy(b, off, buffer, offset, len);
        offset += len;
    }
    
    public void write(int b) {
        canWrite(1);
        buffer[offset] = (byte) b;
        offset ++;
    }
    
    public void reset() {
        offset = 0;
    }
    
    public int bytesWroteSinceLast() {
        return offset;
    }
    
    public byte[] getWroteBytes() {
        byte[] b = new byte[offset];
        System.arraycopy(buffer, 0, b, 0, offset);
        return b;
    }
    
    void canWrite(int len) {
        if (offset + len > buffer.length) {
            throw new IllegalStateException("Buffer is overflow");
        }
    }
    
    /* DATA */
    byte[] buffer;
    int offset;
}


пользоваться этим вот так
Код

MyOutputStream os = new MyOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(os);

os.reset();
oos.writeObject(somePacket);
oos.flush();

byte[] barray = os.getWroteBytes();


Это сообщение отредактировал(а) pathfinder - 20.5.2010, 22:10
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну я хотел-бы всётаки сделать с моим кодом что-то.
Ведь по идее он почти рабочий. (так со стандартным я теперь вижу что труднее)

Это сообщение отредактировал(а) Ak47black - 20.5.2010, 22:09
PM MAIL   Вверх
pathfinder
Дата 20.5.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В Java нельзя ссылку на объект интерпритировать как указатель на область памяти. System.arraycopy нельзя рассматривать как аналог функции memcopy.

Через ObjectOutputStream удобнее сразу же писать Socket. 
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не ну тут наверно как-то всеравно можно без ObjectOutputStream обойтись. Мне же только всеволищь нужно получить byte[]
PM MAIL   Вверх
COVD
Дата 20.5.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

import java.nio.ByteBuffer;

public class TransportPacket {
   
        byte port;
        byte flag;
        short size;
        byte[] data;

        public byte[] getBytes(){
            int capacity = 1 + 1 + 2 + data.length;
            ByteBuffer byteBuffer = ByteBuffer.allocate(capacity);
            byteBuffer.put(port);
            byteBuffer.put(flag);
            byteBuffer.putShort(size);
            byteBuffer.put(data);            
            return byteBuffer.array();
        }
        public static TransportPacket parseBytes(byte[] bytes){
            int capacity = bytes.length;
            ByteBuffer byteBuffer = ByteBuffer.allocate(capacity);
            byteBuffer.put(bytes);
            byteBuffer.flip();
            
            TransportPacket transportPacket = new TransportPacket();

            transportPacket.port = byteBuffer.get();
            transportPacket.flag = byteBuffer.get();
            transportPacket.size = byteBuffer.getShort();
            
            byte[] data = new byte[byteBuffer.remaining()];
            byteBuffer.get(data);
            transportPacket.data = data;
            
            return transportPacket;
        }    
}


Это сообщение отредактировал(а) COVD - 20.5.2010, 22:38
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не у Вас не универсальная функция
Я просто будут делать классы для пакетов имеющие разные переменные, но все наследующие класс Packet который имеет поле size.
PM MAIL   Вверх
pathfinder
Дата 20.5.2010, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ObjectOutputStream это стандартный способ. 
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



+  smile 
Хорошо, а кто-нибудь может ещё как-то подправить мой код что-бы он работал?
PM MAIL   Вверх
pathfinder
Дата 20.5.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Извиняюсь вопрос не понял. Способ COVD-а классный.
PM MAIL   Вверх
Ak47black
Дата 20.5.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Это сообщение отредактировал(а) Ak47black - 20.5.2010, 22:55
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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