Змінюй хід війни! Допомагай ЗСУ!
  • 16 листопада форум не працюватиме з 18:00 до 23:59 з технічних причин. Просимо вибачення за незручності

Java или как такое делаеться на др языках

  • Автор теми Автор теми ligorl
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 20.03.2010
Повідом.: 145
Java или как такое делаеться на др языках

Мне надо для джава для других языков я тоже не против взглянуть
задача такая
Надо в Массив байт записывать число типа float, int,
как мне обьясняли float 4 байта как в массив записать эти 4 байта
int 2байта
Покажите плиз знаю туплю.
 
Что значит "массив байт"

Можно создать массив типа int, или типа float. И заполнить его значениями
Какая задача стоит, не совсем понятно?

з.ы.
Одномерный массив типа int это просто перечисление целых значений. Например:
[4, 3, 0, 8, 3, 0, 1, 2]
Одномерный массив типа float это перечисление чисел с плавающей запятой:
[1.5, 3.01, 0.44, 80.2, 8.5, 0.2, 9, 2.4]

Естественно в типе float возможно хранить и целые числа. Но если заведомо известно что числа не будут (не будут нужны) дробные, то следует использовать тип int
 
Поскольку в Java прямой доступ к памяти невозможен, то приходится делать кое-какие ухищрения (кстати, в Java int - тоже 4 байта, а 2 байта - это short):

Код:
byte[] result;
java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
java.io.DataOutputStream dout = new java.io.DataOutputStream(bout);
int i = 123;
float f = 123.4f;
try
{
    dout.writeInt(i);
    dout.writeFloat(f);
    dout.close();
    result = bout.toByteArray();
    bout.close();
}
catch (java.io.IOException ex)
{
    //**** happens
}

Заглянув в исходный код стандартной библиотеки, нетрудно увидеть, как всё это делается внутри. Например, для Float'а, всё упирается в native вызов
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


На С++ это может выглядеть примерно так:
Код:
unsigned char res[sizeof(int)+sizeof(float)];    

int i = 123;
float f = 123.4f;

memcpy(res, &i, sizeof(int));
memcpy((res+sizeof(int)), &f, sizeof(float));


Добавлено позже
На самом примеру на C++ более соответствует примерно такой Java код:
Код:
byte[] res = new byte[8]; //В Java размер int строго определён, в отличие от C/C++
int i = 123;
float f = 123.4f;
java.io.Bits.putInt(res, 0, i);
java.io.Bits.putFloat(res, 4, f);
Правда этот код использует внутренний класс пакета java.io, но реализовать его самому не составит труда (особенно при том, что исходный код доступен).
 
Останнє редагування:
В C++ есть union'ы, поэтому все будет выглядеть гораздо проще ;)
Не уверен :) Юнион выравниваеться по максимальному размеру. Еси члены имеють разный размер, то при копировании юниона могут случаться шит хэпенды. Нада отслеживать.
 
Уважаемый balkauser..
хорошо а как мне теперь имея эти данные в байте вернуть обратно мне очень надо в этом разобраться.
 
Не уверен Юнион выравниваеться по максимальному размеру. Еси члены имеють разный размер, то при копировании юниона могут случаться шит хэпенды. Нада отслеживать.
Складывать в один массиву float и int "как есть" - это по определению глупо, т.к. если неизвестно, где float, а где int, то толку от такого массива никакого. Если известно - нужно использовать структуры, либо одну из реализаций variant.
Кроме того, float и int таки имеют одинаковый размер.

хорошо а как мне теперь имея эти данные в байте вернуть обратно мне очень надо в этом разобраться.
Бу-га-га. Достать данные из такого массива можно аж двумя способами. Причем оба неправильные :D
 
Складывать в один массиву float и int "как есть" - это по определению глупо, т.к. если неизвестно, где float, а где int, то толку от такого массива никакого. Если известно - нужно использовать структуры, либо одну из реализаций variant.
Кроме того, float и int таки имеют одинаковый размер.
Я не про специфику случая а про общую практику писал.
Кста это не глупо, такое очень часто применяеться в различного рода самописных аналогах БД, а может и не тока в самописных - БД не писал.
 
Я не про специфику случая а про общую практику писал.
Кста это не глупо, такое очень часто применяеться в различного рода самописных аналогах БД, а может и не тока в самописных - БД не писал.
Скорее всего не совсем такое. И создается там наверняка не массив в стеке.
 
Уважаемый balkauser..
хорошо а как мне теперь имея эти данные в байте вернуть обратно мне очень надо в этом разобраться.
А проявить немного инициативы и догадливости слабо?

Для прочтения назад, нужно всё то же самое, но меняем OutputStream'ы на InputStream'ы, а writeXyz, на readXyz. Для ознакомления с деталями читать официальные доки про пакет
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
, а лучше сорцы.
 
Скорее всего не совсем такое. И создается там наверняка не массив в стеке.
Ну то шо видел я используеться в том числе и на эмбед системах. Там два массива в куче - один с датой второй с офсетами элементов. Остальное, в смысле контроль типов и т.д. возлагаеться на бизнес логику. Методы типа гет валью эс инт просто кастят дату по офсету.
 
Ну то шо видел я используеться в том числе и на эмбед системах. Там два массива в куче - один с датой второй с офсетами элементов. Остальное, в смысле контроль типов и т.д. возлагаеться на бизнес логику. Методы типа гет валью эс инт просто кастят дату по офсету.
Согласен, такой вариант имеет право на жизнь. Но у ТС совсем другой случай. Скорее всего он хочет сложить кучку int'ов и float'ов, а потом достать их и в таком же виде.

а как следить за порядком байт?
Порядок байт определяется архитектурой машины. Использование union не как на него не влияет.

ligorl, ты можешь внятно описать, что у тебя на входе, и что нужно получить на выходе?
 
Назад
Зверху Знизу