我正在尝试从比特币交易中读取价值 - 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。
答案 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"