PackUtil.php 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace PhpZip\Util;
  3. /**
  4. * Pack util
  5. *
  6. * @author Ne-Lexa alexey@nelexa.ru
  7. * @license MIT
  8. */
  9. class PackUtil
  10. {
  11. /**
  12. * @param int|string $longValue
  13. * @return string
  14. */
  15. public static function packLongLE($longValue)
  16. {
  17. if (PHP_INT_SIZE === 8 && PHP_VERSION_ID >= 506030) {
  18. return pack("P", $longValue);
  19. }
  20. $left = 0xffffffff00000000;
  21. $right = 0x00000000ffffffff;
  22. $r = ($longValue & $left) >> 32;
  23. $l = $longValue & $right;
  24. return pack('VV', $l, $r);
  25. }
  26. /**
  27. * @param string|int $value
  28. * @return int
  29. */
  30. public static function unpackLongLE($value)
  31. {
  32. if (PHP_INT_SIZE === 8 && PHP_VERSION_ID >= 506030) {
  33. return unpack('P', $value)[1];
  34. }
  35. $unpack = unpack('Va/Vb', $value);
  36. return $unpack['a'] + ($unpack['b'] << 32);
  37. }
  38. /**
  39. * Cast to signed int 32-bit
  40. *
  41. * @param int $int
  42. * @return int
  43. */
  44. public static function toSignedInt32($int)
  45. {
  46. if (PHP_INT_SIZE === 8) {
  47. $int = $int & 0xffffffff;
  48. if ($int & 0x80000000) {
  49. return $int - 0x100000000;
  50. }
  51. }
  52. return $int;
  53. }
  54. }