%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/3rdparty/deepdiver/zipstreamer/src/ |
| Current File : /www/varak.net/nextcloud.varak.net/3rdparty/deepdiver/zipstreamer/src/Count64.php |
<?php
/**
* Simple class to support some very basic operations on 64 bit intergers
* on 32 bit machines.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Nicolai Ehemann <en@enlightened.de>
* @copyright Copyright (C) 2013-2014 Nicolai Ehemann and contributors
* @license GNU GPL
*/
namespace ZipStreamer;
use ZipStreamer\Lib\Count64_32;
use ZipStreamer\Lib\Count64_64;
use ZipStreamer\Lib\Count64Base;
const INT64_HIGH_MAP = 0xffffffff00000000;
const INT64_LOW_MAP = 0x00000000ffffffff;
const INT_MAX_32 = 0xffffffff;
/**
* Unsigned right shift
*
* @param int $bits integer to be shifted
* @param int $shift number of bits to be shifted
* @return int shifted integer
*/
function urShift($bits, $shift) {
if ($shift == 0) {
return $bits;
}
return ($bits >> $shift) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($shift - 1));
}
/**
* Pack 1 byte data into binary string
*
* @param mixed $data data
* @return string 1 byte binary string
*/
function pack8($data) {
return pack('C', $data);
}
/**
* Pack 2 byte data into binary string, little endian format
*
* @param mixed $data data
* @return string 2 byte binary string
*/
function pack16le($data) {
return pack('v', $data);
}
/**
* Unpack 2 byte binary string, little endian format to 2 byte data
*
* @param string $data binary string
* @return integer 2 byte data
*/
function unpack16le($data) {
$result = unpack('v', $data);
return $result[1];
}
/**
* Pack 4 byte data into binary string, little endian format
*
* @param mixed $data data
* @return 4 byte binary string
*/
function pack32le($data) {
return pack('V', $data);
}
/**
* Unpack 4 byte binary string, little endian format to 4 byte data
*
* @param string $data binary string
* @return integer 4 byte data
*/
function unpack32le($data) {
$result = unpack('V', $data);
return $result[1];
}
/**
* Pack 8 byte data into binary string, little endian format
*
* @param mixed $data data
* @return string 8 byte binary string
*/
function pack64le($data) {
if (is_object($data)) {
if (Count64_32::class == get_class($data)) {
$value = $data->_getValue();
$hiBytess = $value[0];
$loBytess = $value[1];
} else {
$hiBytess = ($data->_getValue() & INT64_HIGH_MAP) >> 32;
$loBytess = $data->_getValue() & INT64_LOW_MAP;
}
} else if (4 == PHP_INT_SIZE) {
$hiBytess = 0;
$loBytess = $data;
} else {
$hiBytess = ($data & INT64_HIGH_MAP) >> 32;
$loBytess = $data & INT64_LOW_MAP;
}
return pack('VV', $loBytess, $hiBytess);
}
/**
* Unpack 8 byte binary string, little endian format to 8 byte data
*
* @param string $data binary string
* @return Count64Base data
*/
function unpack64le($data) {
$bytes = unpack('V2', $data);
return Count64::construct(array(
$bytes[1],
$bytes[2]
));
}
abstract class Count64 {
public static function construct($value = 0, $limit32Bit = False) {
if (4 == PHP_INT_SIZE) {
return new Count64_32($value, $limit32Bit);
}
return new Count64_64($value, $limit32Bit);
}
}