58 private function __construct() {}
88 return pack(
"V*", $value & 0xffffffff, $value / (0xffffffff+1));
102 list(, $lolo, $lohi, $hilo, $hihi) = unpack(
"v*", $value);
103 return ($hihi * (0xffff+1) + $hilo) * (0xffffffff+1) +
104 ($lohi * (0xffff+1) + $lolo);
115 return pack(
"N*", $value / (0xffffffff+1), $value & 0xffffffff);
129 list(, $hihi, $hilo, $lohi, $lolo) = unpack(
"n*", $value);
130 return ($hihi * (0xffff+1) + $hilo) * (0xffffffff+1) +
131 ($lohi * (0xffff+1) + $lolo);
142 return pack(
"l*", $value);
153 list(, $int) = unpack(
"l*", $value);
165 if (self::isBigEndian())
166 return strrev(self::toInt32($value));
179 if (self::isBigEndian())
193 if (self::isBigEndian())
196 return strrev(self::toInt32($value));
207 if (self::isBigEndian())
221 return pack(
"V*", $value);
232 if (PHP_INT_SIZE < 8) {
233 list(, $lo, $hi) = unpack(
"v*", $value);
234 return $hi * (0xffff+1) + $lo;
236 list(, $int) = unpack(
"V*", $value);
249 return pack(
"N*", $value);
260 if (PHP_INT_SIZE < 8) {
261 list(, $hi, $lo) = unpack(
"n*", $value);
262 return $hi * (0xffff+1) + $lo;
264 list(, $int) = unpack(
"N*", $value);
277 return pack(
"s*", $value);
288 list(, $int) = unpack(
"s*", $value);
300 if (self::isBigEndian())
301 return strrev(self::toInt16($value));
314 if (self::isBigEndian())
328 if (self::isBigEndian())
331 return strrev(self::toInt16($value));
342 if (self::isBigEndian())
355 private static function fromUInt16($value, $order = self::MACHINE_ENDIAN_ORDER)
357 list(, $int) = unpack
358 (($order == self::BIG_ENDIAN_ORDER ?
"n" :
359 ($order == self::LITTLE_ENDIAN_ORDER ?
"v" :
"S")) .
"*", $value);
371 return pack(
"v*", $value);
382 return self::fromUInt16($value, self::LITTLE_ENDIAN_ORDER);
393 return pack(
"n*", $value);
404 return self::fromUInt16($value, self::BIG_ENDIAN_ORDER);
415 return pack(
"c*", $value);
426 list(, $int) = unpack(
"c*", $value);
438 return pack(
"C*", $value);
449 list(, $int) = unpack(
"C*", $value);
461 return pack(
"f*", $value);
472 list(, $float) = unpack(
"f*", $value);
484 if (self::isBigEndian())
485 return strrev(self::toFloat($value));
498 if (self::isBigEndian())
512 if (self::isBigEndian())
515 return strrev(self::toFloat($value));
526 if (self::isBigEndian())
542 public static function toString8($value, $length =
false, $padding =
"\0")
544 if ($length ===
false)
545 $length = strlen($value);
546 if ($length < ($tmp = strlen($value)))
547 $length = $tmp + $length;
548 return str_pad($value, $length, $padding);
559 return rtrim($value,
"\0");
579 ($value, $order =
false, $length =
false, $padding =
"\0")
581 if ($length ===
false)
582 $length = (int)(strlen($value) / 2);
583 if ($length < ($tmp = strlen($value) / 2))
584 $length = $tmp + $length;
585 if ($order == self::BIG_ENDIAN_ORDER &&
586 !(ord($value[0]) == 0xfe && ord($value[1]) == 0xff)) {
587 $value = 0xfeff . $value;
590 if ($order == self::LITTLE_ENDIAN_ORDER &&
591 !(ord($value[0]) == 0xff && ord($value[1]) == 0xfe)) {
592 $value = 0xfffe . $value;
595 return str_pad($value, $length * 2, $padding);
611 ($value, &$order =
false, $trimOrder =
false)
613 if (strlen($value) < 2)
616 if (ord($value[0]) == 0xfe && ord($value[1]) == 0xff) {
619 $value = substr($value, 2);
621 if (ord($value[0]) == 0xff && ord($value[1]) == 0xfe) {
624 $value = substr($value, 2);
627 return substr($value, -2) ==
"\0\0" ? substr($value, 0, -2) : $value;
638 return pack(
"H*", $value);
649 list($hex) = unpack(
"H*0", $value);
661 return pack(
"h*", $value);
672 list($hex) = unpack(
"h*0", $value);
685 $string =
""; $C = preg_split(
"/-/", $value);
687 (
"V1v2N2", hexdec($C[0]), hexdec($C[1]), hexdec($C[2]),
688 hexdec($C[3] . substr($C[4], 0, 4)), hexdec(substr($C[4], 4)));
700 $C = @unpack(
"V1V/v2v/N2N", $value);
701 list($hex) = @unpack(
"H*0", pack
702 (
"NnnNN", $C[
"V"], $C[
"v1"], $C[
"v2"], $C[
"N1"], $C[
"N2"]));
705 if (implode(
"", unpack(
"H*", pack(
"H*",
"a"))) ==
"a00")
706 $hex = substr($hex, 0, -1);
709 (
"/^(.{8})(.{4})(.{4})(.{4})/",
"\\1-\\2-\\3-\\4-", $hex);