【发布时间】:2015-08-11 11:18:32
【问题描述】:
我需要对遗留文件中包含的数据做一些工作。为此,我需要从 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);
}
现在我需要做相反的事情:写入数据类型。
笔记:
我知道answer 到Convert C# double to Delphi Real48 的问题,但它看起来非常hacky,我认为可能有一个更清洁的解决方案。而且我的机器本身不支持 64 位。
【问题讨论】:
标签: php binary precision turbo-pascal