Пример #1
0
 static function BigEndian2Float($byteword)
 {
     // ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic
     // http://www.psc.edu/general/software/packages/ieee/ieee.html
     // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html
     $bitword = getid3_lib::BigEndian2Bin($byteword);
     if (!$bitword) {
         return 0;
     }
     $signbit = $bitword[0];
     switch (strlen($byteword) * 8) {
         case 32:
             $exponentbits = 8;
             $fractionbits = 23;
             break;
         case 64:
             $exponentbits = 11;
             $fractionbits = 52;
             break;
         case 80:
             // 80-bit Apple SANE format
             // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
             $exponentstring = substr($bitword, 1, 15);
             $isnormalized = intval($bitword[16]);
             $fractionstring = substr($bitword, 17, 63);
             $exponent = pow(2, getid3_lib::Bin2Dec($exponentstring) - 16383);
             $fraction = $isnormalized + getid3_lib::DecimalBinary2Float($fractionstring);
             $floatvalue = $exponent * $fraction;
             if ($signbit == '1') {
                 $floatvalue *= -1;
             }
             return $floatvalue;
             break;
         default:
             return false;
             break;
     }
     $exponentstring = substr($bitword, 1, $exponentbits);
     $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits);
     $exponent = getid3_lib::Bin2Dec($exponentstring);
     $fraction = getid3_lib::Bin2Dec($fractionstring);
     if ($exponent == pow(2, $exponentbits) - 1 && $fraction != 0) {
         // Not a Number
         $floatvalue = false;
     } elseif ($exponent == pow(2, $exponentbits) - 1 && $fraction == 0) {
         if ($signbit == '1') {
             $floatvalue = '-infinity';
         } else {
             $floatvalue = '+infinity';
         }
     } elseif ($exponent == 0 && $fraction == 0) {
         if ($signbit == '1') {
             $floatvalue = -0;
         } else {
             $floatvalue = 0;
         }
         $floatvalue = $signbit ? 0 : -0;
     } elseif ($exponent == 0 && $fraction != 0) {
         // These are 'unnormalized' values
         $floatvalue = pow(2, -1 * (pow(2, $exponentbits - 1) - 2)) * getid3_lib::DecimalBinary2Float($fractionstring);
         if ($signbit == '1') {
             $floatvalue *= -1;
         }
     } elseif ($exponent != 0) {
         $floatvalue = pow(2, $exponent - (pow(2, $exponentbits - 1) - 1)) * (1 + getid3_lib::DecimalBinary2Float($fractionstring));
         if ($signbit == '1') {
             $floatvalue *= -1;
         }
     }
     return (double) $floatvalue;
 }