我需要对遗留文件中包含的数据做一些工作。为此,我需要从 PHP 中读取和写入Turbo Pascal 的 6 字节(48 位)浮点数。Turbo Pascal 数据类型通常称为 real48 ( specs )。
我有以下 php 代码来读取格式:
/**
* Convert Turbo Pascal 48-bit (6 byte) real to a PHP float
* @param binary 48-bit real (in binary) to convert
* @return float number
*/
function real48ToDouble($real48) {
$byteArray = array_values( unpack('C*', $real48) );
if ($byteArray[0] == 0) {
return 0; // Zero exponent = 0
}
$exponent = $byteArray[0] - 129;
$mantissa = 0;
for ($b = 1; $b <= 4; $b++) {
$mantissa += $byteArray[$b];
$mantissa /= 256;
}
$mantissa += ($byteArray[5] & 127);
$mantissa /= 128;
$mantissa += 1;
if ($byteArray[5] & 128) { // Sign bit check
$mantissa = -$mantissa;
}
return $mantissa * pow(2, $exponent);
}
(改编自)
现在我需要做相反的事情:写入数据类型。
注意:我知道将 C# double 转换为 Delphi Real48 问题的答案,但它看起来非常糟糕,我认为可能有一个更清洁的解决方案。而且我的机器本身不支持 64 位。