Преобразование long [64] в байт [512] в Java? - PullRequest
16 голосов
/ 06 февраля 2010

Я портирую процесс на Java. Уже есть рабочие версии на C # и C ++.

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

Edit:

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

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

1 Ответ

20 голосов
/ 06 февраля 2010

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 требуется значения неотрицательного целочисленного индекса . Приведение byte к int приведет к расширению знака, но маскирование битов более высокого порядка даст значение без знака byte b:

int i = (int) b & 0xFF;

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

...