レガシー ファイルに含まれるデータを処理する必要があります。この目的のために、Turbo Pascal の 6 バイト (48 ビット) 浮動小数点数を PHP から読み書きする必要があります。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 ビットをネイティブにサポートしていません。