- /**
- * Converts a hexadecimal string, even with negative sign as first string to
- * a decimal number using BC functions.
- *
- * This work is based on comment #86673 on php.net documentation page at:
- * <http://de.php.net/manual/en/function.dechex.php#86673>
- *
- * @param $hex Hexadecimal string
- * @return $dec Decimal number
- */
- protected function hex2dec ($hex) {
- // Convert to all lower-case
- $hex = strtolower($hex);
-
- // Detect sign (negative/positive numbers)
- $sign = '';
- if (substr($hex, 0, 1) == '-') {
- $sign = '-';
- $hex = substr($hex, 1);
- } // END - if
-
- // Decode the hexadecimal string into a decimal number
- $dec = 0;
- for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
- $factor = self::$hexdec[substr($hex, $i, 1)];
- $dec = bcadd($dec, bcmul($factor, $e));
- } // END - for
-
- // Return the decimal number
- return $sign . $dec;
- }
-
- /**
- * Converts even very large decimal numbers, also signed, to a hexadecimal
- * string.
- *
- * This work is based on comment #97756 on php.net documentation page at:
- * <http://de.php.net/manual/en/function.hexdec.php#97756>
- *
- * @param $dec Decimal number, even with negative sign
- * @param $maxLength Optional maximum length of the string
- * @return $hex Hexadecimal string
- */
- protected function dec2hex ($dec, $maxLength = 0) {
- // maxLength can be zero or devideable by 2
- assert(($maxLength == 0) || (($maxLength % 2) == 0));
-
- // Detect sign (negative/positive numbers)
- $sign = '';
- if ($dec < 0) {
- $sign = '-';
- $dec = abs($dec);
- } // END - if
-
- // Encode the decimal number into a hexadecimal string
- $hex = '';
- do {
- $hex = self::$dechex[($dec % (2 ^ 4))] . $hex;
- $dec /= (2 ^ 4);
- } while ($dec >= 1);
-
- /*
- * Leading zeros are required for hex-decimal "numbers". In some
- * situations more leading zeros are wanted, so check for both
- * conditions.
- */
- if ($maxLength > 0) {
- // Prepend more zeros
- $hex = str_pad($hex, $maxLength, '0', STR_PAD_LEFT);
- } elseif ((strlen($hex) % 2) != 0) {
- // Only make string's length dividable by 2
- $hex = '0' . $hex;
- }
-
- // Return the hexadecimal string
- return $sign . $hex;
- }
-
- /**
- * Converts a ASCII string (0 to 255) into a decimal number.
- *
- * @param $asc The ASCII string to be converted
- * @return $dec Decimal number
- */
- protected function asc2dec ($asc) {
- // Convert it into a hexadecimal number
- $hex = bin2hex($asc);
-
- // And back into a decimal number
- $dec = $this->hex2dec($hex);
-
- // Return it
- return $dec;
- }
-
- /**
- * Converts a decimal number into an ASCII string.
- *
- * @param $dec Decimal number
- * @return $asc An ASCII string
- */
- protected function dec2asc ($dec) {
- // First convert the number into a hexadecimal string
- $hex = $this->dec2hex($dec);
-
- // Then convert it into the ASCII string
- $asc = $this->hex2asc($hex);
-
- // Return it
- return $asc;
- }
-
- /**
- * Converts a hexadecimal number into an ASCII string. Negative numbers
- * are not allowed.
- *
- * @param $hex Hexadecimal string
- * @return $asc An ASCII string
- */
- protected function hex2asc ($hex) {
- // Check for length, it must be devideable by 2
- //* DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('hex='.$hex);
- assert((strlen($hex) % 2) == 0);
-
- // Walk the string
- $asc = '';
- for ($idx = 0; $idx < strlen($hex); $idx+=2) {
- // Get the decimal number of the chunk
- $part = hexdec(substr($hex, $idx, 2));
-
- // Add it to the final string
- $asc .= chr($part);
- } // END - for
-
- // Return the final string
- return $asc;
- }