Преобразование long [64] в байт [512] в Java?

Я переношу процесс на Java. Там уже работают версии на С# и С++.

У меня есть раздел в С#, который я делаю Marshal.Copy(...), чтобы преобразовать 64 ulongs в 512 байт, и эта строка на С++ я использую memmove (...), чтобы сделать то же самое. Что доступно на Java для достижения того же результата? Мне нужна такая же двоичная информация в том же порядке, что и байты вместо longs.

Edit:

Причина, по которой я переношу на Java, заключается в том, чтобы использовать переносимость, которую Java, естественно, имеет. Я бы не хотел использовать собственный код.

Другое дело. Поскольку Java не содержит неподписанных значений, мне нужно немного изменить то, что я запрашиваю. Я хотел бы получить 8 значений без знака байта из каждой из 64 длин (ulongs на С# и С++), чтобы впоследствии использовать эти значения в индексах в массивах. Это должно произойти тысячи раз, поэтому самый быстрый способ - лучший способ.

Ответ 1

ByteBuffer хорошо работает для этого: просто введите 64 long значения и получите byte[] с помощью array() метод. Класс ByteOrder может эффективно обрабатывать конечные проблемы. Например, включение подхода, предложенного в комментарии wierob:

private static byte[] xform(long[] la, ByteOrder order) {
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8);
    bb.order(order);
    bb.asLongBuffer().put(la);
    return bb.array();
}

Добавление: результирующие компоненты byte[] являются подписанными 8-битными значениями, но для массивов Java требуется значения неотрицательных целых значений. Выделение a byte в int приведет к расширению знака, но при маскировке бит более высокого порядка будет выдаваться значение без знака byte b:

int i = (int) b & 0xFF;

Этот ответ описывает действующие правила приоритета операторов. Этот связанный ответ демонстрирует аналогичный подход для значений double.