/** * Returns part of number $num, starting at bit * position $start with length $length * * @param gmp resource $num * @param int start * @param int length * @return gmp resource * @access public */ function subint($num, $start, $length) { $start_byte = intval($start / 8); $start_bit = $start % 8; $byte_length = intval($length / 8); $bit_length = $length % 8; if ($bit_length) { $byte_length++; } $bi = new Math_BigInteger($num, 10); $divider = new Math_BigInteger(1 << $start_bit); $res = $bi->divide($divider); $bi = $res[0]; $tmp = _byte_strrev(_byte_substr($bi->toBytes(), $start_byte, $byte_length)); $tmp = str_pad($tmp, $byte_length, ""); $tmp = _byte_substr_replace($tmp, $tmp[$byte_length - 1] & _byte_chr(0xff >> 8 - $bit_length), $byte_length - 1, 1); return $this->bin2int($tmp); }
/** * Returns part of number $num, starting at bit * position $start with length $length * * @param gmp resource $num * @param int start * @param int length * @return gmp resource * @access public */ function subint($num, $start, $length) { $start_byte = intval($start / 8); $start_bit = $start % 8; $byte_length = intval($length / 8); $bit_length = $length % 8; if ($bit_length) { $byte_length++; } $num = gmp_div($num, 1 << $start_bit); $tmp = _byte_substr($this->int2bin($num), $start_byte, $byte_length); $tmp = str_pad($tmp, $byte_length, ""); $tmp = _byte_substr_replace($tmp, $tmp[$byte_length - 1] & _byte_chr(0xff >> 8 - $bit_length), $byte_length - 1, 1); return $this->bin2int($tmp); }