Есть ли в Java удобная библиотека классов для манипулирования byte[], например для записи других типов данных по нижнему индексу?

Я переписываю кусок кода Go на Java:

//instruction is a byte[], o is an int.
//Start writing an int type data from the offset subscript of the instruction
binary.BigEndian.PutUint16(instruction[offset:], uint16(o))

Мне нужно добиться эффекта, аналогичного байту [] в Java, но я не могу найти библиотеку классов в Java, которая может легко выполнить такую ​​​​операцию.

Когда я использую copilot, он предлагает мне использовать битовые операции для выполнения работы, но это слишком утомительно и нечитаемо, я не хочу этого делать, поэтому мне нужна библиотека классов.

Может Байтбуффер?

experiment unit 1998X 18.02.2023 03:47
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
4
1
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать MethodHandles::byteArrayViewVarHandle:

var handle = MethodHandles.byteArrayViewVarHandle(short[].class, ByteOrder.nativeOrder());
byte[] arr = new byte[2];
handle.set(arr, 0, (short) 42);
// arr ==> byte[2] { 42, 0 }
Ответ принят как подходящий

Одним из способов было бы обернуть массив байтов в ByteBuffer и использовать его различные putXXX методы.

Например

// "wrap" makes a big endian byte buffer by default
var buffer = ByteBuffer.wrap(yourByteArray);
// puts 300 as a 16 bit signed integer (short) at index 1
buffer.putShort(1, (short)300);

Есть также put (для byte), putChar, putDouble, putFloat, putLong, putInt.

И используйте docs.oracle.com/javase/7/docs/api/java/nio/…, чтобы указать обратный порядок.

Sean F 18.02.2023 04:12

@SeanF wrap делает это по умолчанию, но, думаю, я должен сделать это яснее :)

Sweeper 18.02.2023 04:18

Ну да, я думаю, Java по умолчанию имеет обратный порядок байтов, не думал об этом.

Sean F 18.02.2023 04:22

Если вы обращаетесь к данным последовательно, подойдет и проверенный временем DataOutputStream:

    var baos = new ByteArrayOutputStream();
    try (var out = new DataOutputStream(baos)) {
        out.writeShort(0xfffe);
    }
    var bytes = baos.toByteArray();
    System.out.println(Arrays.toString(bytes));
    try (var in = new DataInputStream(new ByteArrayInputStream(bytes))) {
        var us = in.readUnsignedShort();
        System.out.println(us);
    }

(если вам не нужен byte[], вы, конечно, можете выполнять потоковую передачу напрямую в/из файла, сокета и т. д.)

Другие вопросы по теме