поменяйте местами байты с порядком байтов - PullRequest
0 голосов
/ 05 марта 2011

Немного запутался во всем, что касается байтов, даже после чтения.Скажем, у меня есть шестнадцатеричное значение ...

AA 37 D6 08 DF BF CB 01

, и я хочу преобразовать его в ...

01 CB BF DF 08 D6 37 AA

(что является прямым порядком байтов?) Как бы я поступилэто на яве?Как только это будет сделано, мне нужно будет преобразовать его в десятичный.Извините, если это прямо вперед, я новичок в этом, так как моя голова кружится от этого, смеется.Спасибо за любую помощь заранее!

Ответы [ 3 ]

0 голосов
/ 05 марта 2011

Для справки, просто посмотрев на группу байтов, вы не узнаете, является ли число байтом с прямым порядком байтов или байтом с прямым порядком байтов (если только вы не знаете, какое число они представляют). Причина, по которой вам следует позаботиться в первую очередь, заключается в том, что одни и те же байты представляют два разных числа в зависимости от того, должны ли байты интерпретироваться как little-endian или big-endian.

Теперь, когда сказано, что вы знаете, что байты представляют собой порядковый номер с прямым порядком байтов, и вы хотите интерпретировать его как Java long, вы можете использовать некоторый код, например:

long result = 0;
for (int i = 0; i < 8; ++i)
{
    result |= (bytes[i] & 0xffL) << (8 * i);
}

Получив это, вы можете использовать Long.toString(result, 16), чтобы показать результат в виде шестнадцатеричного числа, если хотите.

0 голосов
/ 05 марта 2011

Как описано ниже, вы можете использовать ByteBuffer, чтобы интерпретировать значение как значение с большим или младшим порядком байтов. Здесь есть связанный пример здесь . Для удобства обратите внимание, что конструктор double для BigDecimal "переводит двойное число в BigDecimal, которое является точным десятичным представлением двоичного двоичного значения с плавающей точкой."

Консоль

400921fb54442d18 = 3.141592653589793
182d4454fb210940 = 3.207375630676366E-192
3.141592653589793 = 3.141592653589793115997963468544185161590576171875

Код:

import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/** @see https://stackoverflow.com/questions/5200863 */
public class DoubleOrder {

    public static void main(String[] args) {
        double pi = Math.PI;
        ByteBuffer bb = ByteBuffer.allocate(Double.SIZE / 8);
        bb.putDouble(pi);
        display(bb, ByteOrder.BIG_ENDIAN);
        display(bb, ByteOrder.LITTLE_ENDIAN);
        System.out.println(pi + " = " + new BigDecimal(pi));
    }

    private static void display(ByteBuffer bb, ByteOrder order) {
        bb.order(order);
        Long bits = Double.doubleToLongBits(bb.getDouble(0));
        String s = Long.toHexString(bits);
        Double d = Double.longBitsToDouble(Long.valueOf(s, 16));
        System.out.println(s + " = " + d.toString());
    }
}
0 голосов
/ 05 марта 2011

Имейте в виду, что это иногда будет печатать дополнительные 00 на конце, который вам, возможно, потребуется обрезать в hexSwap.

...