Size: a a a

2020 June 05

AM

Andrew Mikhaylov in Kotlin JVM
Ну вот у вас описание структуры данных выше, три f32 (которые float) и три u8 (которые byte). То есть
86 5E 8D 3D 7A 65 93 BA 63 BA 06 3F CC 09 07
маппится примерно так:
f32 PositionX: 86 5E 8D 3D
f32 PositionY: 7A 65 93 BA
f32 PositionZ: 63 BA 06 3F

u8 Accel: CC
u8 Brake: 09
u8 Clutch: 07
С байтами ничего делать не надо, теперь надо разобраться с endianness.
JVM априори big endian вне зависимости от того, на каком процессоре оно выполняется. Если ваши данные little endian, вам надо их превращать в big endian для работы. Для каждого поля берёте и разворачиваете порядок байтов.
f32 PositionX: 3D 8D 5E 86
f32 PositionY: BA 93 65 7A  
f32 PositionZ: 3F 06 BA 63

u8 Accel: CC
u8 Brake: 09
u8 Clutch: 07
После этого ваши флоаты, которые по четыре байта, будут представлены как флоаты по стандарту IEEE 754
f32 PositionX: 0.0690279453993
f32 PositionY: -0.00112454523332
f32 PositionZ: 0.526281535625

u8 Accel: 0xCC
u8 Brake: 0x09
u8 Clutch: 0x07

Как-то так это должно происходить.
источник

ВК

Виктор Колышев... in Kotlin JVM
а считатать мне просто с начала файла и просто в зависимости от группы и числа байт реверсить их?
источник

ВК

Виктор Колышев... in Kotlin JVM
т.е. беру первых 4 если f32, потом вторые и т.д. до конца строки?
источник

AM

Andrew Mikhaylov in Kotlin JVM
Касательно того, как это с котлином на JVM сделать. Заворачиваете, как выше подсказали, ваши данные в виде DataInputStream, далее делаете себе утилитку для чтения данных в нужном формате:
fun DataInputStream.readLEFloat(): Float {
   val leInt = this.readInt()
   val beInt = java.lang.Integer.reverseBytes(leInt)
   return java.lang.Float.intBitsToFloat(beInt)
}

, и читаете последовательно ваши поля:
val positionX = stream.readLEFloat()
val positionY = stream.readLEFloat()
val positionZ = stream.readLEFloat()
val accel = stream.readByte()
val brake = stream.readByte()
val clutch = stream.readByte()
источник

AM

Andrew Mikhaylov in Kotlin JVM
(предупреждаю, что писал от балды, могут быть ошибки)
источник

ВК

Виктор Колышев... in Kotlin JVM
о, даже так можно, а я просто сохраняю строку, а потом её разбираю по частям, а тут все из коробки есть
источник

VP

Vladimir Petrakovich in Kotlin JVM
А можно просто ByteBuffer взять, который из коробки умеет в LE
источник

ВК

Виктор Колышев... in Kotlin JVM
спасибо, дальше я сам разберусь
источник

AM

Andrew Mikhaylov in Kotlin JVM
Vladimir Petrakovich
А можно просто ByteBuffer взять, который из коробки умеет в LE
Или так, да. Я с NIO мало опыта имею, потому собирал подобное на коленке.
источник

AN

Alexander Nozik in Kotlin JVM
Andrew Mikhaylov
Касательно того, как это с котлином на JVM сделать. Заворачиваете, как выше подсказали, ваши данные в виде DataInputStream, далее делаете себе утилитку для чтения данных в нужном формате:
fun DataInputStream.readLEFloat(): Float {
   val leInt = this.readInt()
   val beInt = java.lang.Integer.reverseBytes(leInt)
   return java.lang.Float.intBitsToFloat(beInt)
}

, и читаете последовательно ваши поля:
val positionX = stream.readLEFloat()
val positionY = stream.readLEFloat()
val positionZ = stream.readLEFloat()
val accel = stream.readByte()
val brake = stream.readByte()
val clutch = stream.readByte()
Или лучше ByteBuffer
источник

AM

Andrew Mikhaylov in Kotlin JVM
Виктор Колышев
о, даже так можно, а я просто сохраняю строку, а потом её разбираю по частям, а тут все из коробки есть
Ну и да, строки вам тут не нужны от слова совсем. Вам надо читать байты и раскладывать байты в примитивы.
источник

AN

Alexander Nozik in Kotlin JVM
Andrew Mikhaylov
Или так, да. Я с NIO мало опыта имею, потому собирал подобное на коленке.
Там это значительно удобнее. Единственное место, к которому надо привыкнуть - это правильно флипать буффер при чтении следующей записи
источник

AM

Andrew Mikhaylov in Kotlin JVM
Alexander Nozik
Или лучше ByteBuffer
Я в своё время ниасилил раздуплить (каюсь) местные поинтеры по буфферу, а больше нужды туда копать не было.
источник

AM

Andrew Mikhaylov in Kotlin JVM
Во-во, вот эти ваши флипы. Там наверняка всё просто и понятно, будут задачи — сделаю следующий подход.
источник

AM

Andrew Mikhaylov in Kotlin JVM
Если человек на коленке для себя что-то собирает, оно ему, может, и не надо.
источник

AN

Alexander Nozik in Kotlin JVM
Andrew Mikhaylov
Во-во, вот эти ваши флипы. Там наверняка всё просто и понятно, будут задачи — сделаю следующий подход.
В kotlinx-io это убрали. Там все довольно прозрачно
источник

AM

Andrew Mikhaylov in Kotlin JVM
Ну тут же никто примера ни с kotlinx-io, ни с ByteBuffer не привёл, тут только пошутили про вопросы mail.ru 🤷‍♂️
источник

AN

Alexander Nozik in Kotlin JVM
Andrew Mikhaylov
Ну тут же никто примера ни с kotlinx-io, ни с ByteBuffer не привёл, тут только пошутили про вопросы mail.ru 🤷‍♂️
Я побоялся. Вообще... я это как раз на перволй лекции разбирал. Сейчас пойду посмотрю, насколько там запись приличная.
источник

AM

Andrew Mikhaylov in Kotlin JVM
Виктор Колышев
мне стыдно, больше не буду такой тупизной в этом чате спамить
Если что — у нас есть менее токсичный @kotlin_start, можно туда с вопросами ходить.
источник

ВК

Виктор Колышев... in Kotlin JVM
Andrew Mikhaylov
Если что — у нас есть менее токсичный @kotlin_start, можно туда с вопросами ходить.
спасибо
источник