将big endian java交换为十进制

时间:2011-03-05 00:54:36

标签: java decimal hex endianness

在读完之后,对整个大端,小端的事情感到很困惑。假设我的Hex值为......

AA 37 D6 08 DF BF CB 01

我希望将其转换为...

01 CB BF DF 08 D6 37 AA

(哪个是大端?)我如何用Java做到这一点?一旦完成,我需要将其转换为十进制。对不起,如果这是直截了当的,我很新,因为我的头从它旋转哈哈。感谢您提前提供任何帮助!

3 个答案:

答案 0 :(得分:0)

请记住,这有时会在hexSwap中修剪您需要修剪的额外00。

import java.math.BigInteger;
public class Simon {

    public static String hexSwap(String origHex) {
        // make a number from the hex
        BigInteger orig = new BigInteger(origHex,16);
        // get the bytes to swap
        byte[] origBytes = orig.toByteArray();
        int i = 0;
        while(origBytes[i] == 0) i++;
        // swap the bytes
        byte[] swapBytes = new byte[origBytes.length];
        for(/**/; i < origBytes.length; i++) {
            swapBytes[i] = origBytes[origBytes.length - i - 1];
        }
        BigInteger swap = new BigInteger(swapBytes);
        return swap.toString(10);
    }

    public static void main(String[] args) {
        String orig = "AA37D608DFBFCB01";
        String swap = hexSwap(orig);
        System.out.println(swap);
    }

}

答案 1 :(得分:0)

作为参考,只看一堆字节不会告诉你一个数字是小端还是大端(除非你碰巧知道它们代表的数字)。你必须首先关心的原因是,相同的字节代表两个不同的数字,这取决于字节应该被解释为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)将结果显示为十六进制数字。

答案 2 :(得分:0)

如下所述,您可以使用ByteBuffer将值解释为大端或小端数量。有一个相关的例子here。为方便起见,请注意double的{​​{1}}构造函数将一个double转换为BigDecimal,这是double的二进制浮点值的精确十进制表示。“

控制台:

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

代码:

BigDecimal