Guest User

find_locs.php

a guest
Dec 2nd, 2013
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.65 KB | None | 0 0
  1. <?php
  2.  
  3. ini_set('memory_limit', '900M');
  4. ini_set('display_errors', '1');
  5.  
  6. // set here the valid ranges for all coordinates
  7. $min_x = -5000;
  8. $max_x = 5000;
  9. $min_y = -5000;
  10. $max_y = 5000;
  11. $min_z = -5000;
  12. $max_z = 5000;
  13.  
  14. if (!isset($argv[1])) die('Usage: php find_locs.php <filename>');
  15. $file = $argv[1];
  16.  
  17. /////////////////////////////////////
  18. print "\r\nXSC positions in $file (floats separated by 0x29):\r\n";
  19.  
  20. $data = file_get_contents($file);
  21. if ($data === false) die('Cannot open file');
  22. $total = strlen($data);
  23. $offset = 0;
  24. while (($total - $offset) >= 15)
  25. {
  26.     check_valid_xsc_loc($data, $offset);
  27.     $offset++;
  28. }
  29.  
  30. /////////////////////////////////////
  31. print "\r\nBulk positions in $file (consequtive floats):\r\n";
  32.  
  33. $handle = fopen($file, "r");
  34. if ($handle === false) die('Cannot open file');
  35.  
  36. $x = NAN;
  37. $y = NAN;
  38. $z = NAN;
  39. while (($x !== false) && ($y !== false) && ($z !== false))
  40. {
  41.     if (is_valid_loc($x, $y, $z))
  42.     {
  43.         printf("%.4f, %.4f, %.4f\r\n", $x, $y, $z);
  44.         $x = NAN;
  45.         $y = NAN;
  46.         $z = NAN;
  47.     }  
  48.     $x = $y;
  49.     $y = $z;
  50.     $z = read_float($handle);
  51. }
  52.        
  53. fclose($handle);
  54.  
  55. function read_float($handle)
  56. {
  57.     $dword = fread($handle, 4);
  58.     if ($dword === false) return false;
  59.     if (strlen($dword) != 4) return false;
  60.     return parse_float($dword);
  61. }
  62.  
  63. function parse_float($dword)
  64. {
  65.     return array_pop(unpack("f", strrev($dword)));
  66. }
  67.  
  68. function check_valid_xsc_loc($data, $offset)
  69. {
  70.     if ($data[$offset] != "\x29") return false;
  71.     if ($data[$offset+5] != "\x29") return false;
  72.     if ($data[$offset+10] != "\x29") return false;
  73.     $x = parse_float(substr($data, $offset+1, 4));
  74.     $y = parse_float(substr($data, $offset+6, 4));
  75.     $z = parse_float(substr($data, $offset+11, 4));
  76.     if (is_valid_loc($x, $y, $z))
  77.     {
  78.         printf("%.4f, %.4f, %.4f\r\n", $x, $y, $z);
  79.         return true;
  80.     }
  81.     return false;
  82. }
  83.  
  84. function is_valid_loc($x, $y, $z)
  85. {
  86.     global $min_x;
  87.     global $max_x;
  88.     global $min_y;
  89.     global $max_y;
  90.     global $min_z;
  91.     global $max_z;
  92.     if ($x === false) return false;
  93.     if (!is_finite($x)) return false;
  94.     if ($x > $max_x) return false;
  95.     if ($x < $min_x) return false;
  96.     if (abs($x) < 0.1) return false;
  97.     if ($x == 1) return false;
  98.     if ($x == -1) return false;
  99.     if ($y === false) return false;
  100.     if (!is_finite($y)) return false;
  101.     if ($y > $max_y) return false;
  102.     if ($y < $min_y) return false;
  103.     if (abs($y) < 0.1) return false;
  104.     if ($y == 1) return false;
  105.     if ($y == -1) return false;
  106.     if ($z === false) return false;
  107.     if (!is_finite($z)) return false;
  108.     if ($z > $max_z) return false;
  109.     if ($z < $min_z) return false;
  110.     if (abs($z) < 0.1) return false;
  111.     if ($z == 1) return false;
  112.     if ($z == -1) return false;
  113.     return true;
  114. }
  115.  
  116. ?>
Advertisement
Add Comment
Please, Sign In to add comment