我想计算比特币块的大小

时间:2018-01-24 19:05:22

标签: java bitcoin

我想计算比特币块的大小 我看到了这个主题:link here, 并且在一个回复中有人说" merkle root hash - 32个字节"

然后我去了这个街区:link here

merkle root是:8f5318a45316efedf56ebcadd55889ab377ba78d9a8ac14a81a83e52ad45e07f

我试图计算根,但是我觉得它是64字节。

我计算字节的方式:

byte[] bytes1 = "Here merkle root".getBytes();

System.out.println(bytes1.length);

结果64而不是32

1 个答案:

答案 0 :(得分:1)

merkle root是32个字节,以十六进制编码(使用0-9a-z)表示。这意味着将使用两个字符来表示每个字节,结果字符串将具有两倍于原始数据具有字节的字符。

您不能通过执行getBytes()将字符串转换为字节,因为它会获得表示字符串的字节。

您可以使用BigInteger将字符串解析为数字(大数字),也可以手动或使用外部库(不包含在JDK中)解析为字节数组。

public static void main(String[] args) {
    String merkle = "8f5318a45316efedf56ebcadd55889ab377ba78d9a8ac14a81a83e52ad45e07f";
    System.out.println("String length: " + merkle.length());
    System.out.println("Actual decimal value: " + new BigInteger(merkle, 16));

    byte[] bytes = toBytes(merkle);
    System.out.println("Total bytes: " + bytes.length);
    System.out.println("Actual bytes: " + Arrays.toString(bytes));
}

private static byte[] toBytes(String input) {
    byte[] result = new byte[input.length() / 2];
    for (int i = 0; i < result.length; i++) {
        result[i] = (byte)((Character.digit(input.charAt(i * 2), 16) << 4)
                + Character.digit(input.charAt(i * 2 + 1), 16));
    }
    return result;
}