Я переписываю кусок кода 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, он предлагает мне использовать битовые операции для выполнения работы, но это слишком утомительно и нечитаемо, я не хочу этого делать, поэтому мне нужна библиотека классов.
Вы можете использовать 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/…, чтобы указать обратный порядок.
@SeanF wrap делает это по умолчанию, но, думаю, я должен сделать это яснее :)
Ну да, я думаю, Java по умолчанию имеет обратный порядок байтов, не думал об этом.
Если вы обращаетесь к данным последовательно, подойдет и проверенный временем 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[], вы, конечно, можете выполнять потоковую передачу напрямую в/из файла, сокета и т. д.)
Может Байтбуффер?