Я портирую процесс на Java. Там уже работает версии в C# и C++.
У меня есть раздел в C#, который я действительно Упорядочиваю. Копия (...) для преобразования 64 ulongs в 512 байтов и той строки в C++ я использую memmove (...), чтобы сделать то же самое. Что доступно в Java для достижения того же результата? Мне нужна та же двоичная информация в том же порядке так же, как байты вместо longs.
Править:
Причина, которую я портирую на Java, состоит в том, чтобы использовать в своих интересах мобильность, которую естественно имеет Java. Я не хотел бы использовать собственный код.
Другая вещь. Так как Java не содержит неподписанные значения, тогда я должен изменить то, чем я запрашиваю просто немного. Я хотел бы достигнуть 8 неподписанных значений байта от каждого из 64 longs (ulongs в C# и C++) так, чтобы я мог использовать те значения в индексах в массивах позже. Это должно произойти тысячи времен, таким образом, самым быстрым путем был бы лучший способ.
ByteBuffer
для этого хорошо работает: просто вставьте 64 длинных
значения и получите байт[]
с помощью метода 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();
}
Addendum: результирующие компоненты byte[]
подписаны, 8-битные значения, но для Java-массивов требуются неотрицательные целочисленные значения индекса. При добавлении байта байта
в int
будет произведено знаковое расширение, но маскировка битов более высокого порядка даст беззнаковое значение байта b
:
int i = (int) b & 0xFF;
Этот ответ развивает применимые правила приоритета операторов. Этот родственный ответ демонстрирует аналогичный подход для значений double
.