在PHP中读取8字节整数(比特币)

时间:2013-07-17 19:15:01

标签: php bitcoin

我正在尝试从比特币交易中读取价值 - https://en.bitcoin.it/wiki/Transaction

wiki说这是一个8字节的整数,但是我用unpack试过的东西给了我一个正确的十进制值。

我已经能够从事务中读取除输出值之外的所有其他内容 - 给定其他字段我已设法解析所有排队的正确值,我正在读取正确的8字节。

使用:

$bin = hex2bin('00743ba40b000000');
$value = unpack('lvalue', $bin);
// 'value' => int -1539607552

$bin = hex2bin('d67e690000000000');
$value = unpack('lvalue', $bin);
// 'value' => int 6913750

那应该是500和0.0691375。

1 个答案:

答案 0 :(得分:1)

作为PHP unpack()函数说明的文档,如果您尝试解压缩长度等于PHP的本机整数大小的无符号值(即32位或64位,具体取决于PHP的编译方式),可能会发生奇怪的事情:

  

“请注意,PHP在内部将整数值存储为signed。如果解压缩大的unsigned long并且它与PHP内部存储的值大小相同,则即使指定了unsigned解包,结果也将是负数。”

可以说,这是一个PHP错误:如果我要求一个无符号值,我当然希望得到一个无符号值,即使它必须在内部表示为浮点数。

在任何情况下,解决这个“怪癖”的一种方法是将二进制字符串解压缩为较小的块,例如每个8或16位,然后手动重新组装,如下所示:

$bin = pack( 'H*', '00743ba40b000000' );

$words = array_reverse( unpack( 'v*', $bin ) );
$n = 0;
foreach ( $words as $word ) {
    $n = (1 << 16) * $n + $word;
}

echo "$n\n";  // prints "50000000000"