2

基本的に、私の問題は 2 つあり、特にビットコイン RPC に言及しています。Litecoin (BTC のスピンオフ) 用に Java でマイナーを作成しており、次のような文字列を取得する必要があります。

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 メソッドを持っているので、16 進数の文字列を取得できます。
  2. その文字列から StringBuffer を作成し、reverse() を呼び出すことができます。
  3. 次に、toString() を使用して文字列に変換し、getBytes() を介してバイトを取得します。

これが「最善」かどうかはわかりませんが、あなたの側での作業はほとんど必要ありません。

より速い速度が必要な場合は、元の間違った方向の 16 進文字列 (ステップ 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 に答える