2

基本上,我的问题是双重的,特别是指比特币 RPC。我正在用 Java 为莱特币(BTC 的衍生产品)编写一个矿工,需要一个如下所示的字符串:

000000000000000000000000000000000000000000000000000000ffff0f0000

将其转换为外观

00000fffff000000000000000000000000000000000000000000000000000000

(我相信这是从小端切换到大端)

然后我需要将该字符串转换为字节数组——

我查看了 org.apache 中的 Hex 类、String.toByte() 和一段代码,如下所示:

public static byte[] toByta(char[] data) {
    if (data == null) return null;
    // ----------
    byte[] byts = new byte[data.length * 2];
    for (int i = 0; i < data.length; i++)
        System.arraycopy(toByta(data[i]), 0, byts, i * 2, 2);
    return byts;
}

所以本质上:在Java中改变字节顺序的最好方法是什么?获取数字的字符串表示并将其转换为要散列的字节数组的最佳方法是什么?

编辑:更改字节序后我得到了错误的结果。

4

1 回答 1

2
  1. Integer 和 BigInteger 都具有采用基数的 toString 方法,因此您可以获得十六进制字符串。
  2. 您可以从该字符串创建一个 StringBuffer 并调用 reverse()。
  3. 然后使用 toString() 转换回字符串,然后通过 getBytes() 获取字节;

不知道这是否是“最好的”,但它需要您做很少的工作。

如果您需要更快的速度,请在原始错误方向十六进制字符串(来自步骤 1)上调用 getBytes() 并使用 for 循环将其反转到位。例如

for (int i=0; i<bytes.length/2; i++) {
   byte temp = bytes[i];
   bytes[i] = bytes[bytes.length - i];
   bytes[bytes.length - i] = temp;
}
于 2011-11-07T01:42:48.430 回答