Added fabled hex2bin() function

This commit is contained in:
Scott MacVicar 2011-06-03 00:12:22 +00:00
parent ce966baaa4
commit 76cbcc7f66
5 changed files with 71 additions and 1 deletions

1
NEWS
View File

@ -130,6 +130,7 @@ PHP NEWS
- Improved core functions:
. number_format() no longer truncates multibyte decimal points and thousand
separators to the first byte. FR #53457. (Adam)
. Added hex2bin() function. (Scott)
- Improved CURL extension:
. Added support for CURLOPT_MAX_RECV_SPEED_LARGE and

View File

@ -358,10 +358,11 @@ UPGRADE NOTES - PHP X.Y
- Core:
- get_declared_traits()
- hex2bin()
- http_response_code()
- trait_exists()
- stream_set_chunk_size()
- socket_import_stream()
- trait_exists()
- LDAP:
- ldap_control_paged_results()

View File

@ -2142,6 +2142,10 @@ ZEND_BEGIN_ARG_INFO(arginfo_bin2hex, 0)
ZEND_ARG_INFO(0, data)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_hex2bin, 0)
ZEND_ARG_INFO(0, data)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_strspn, 0, 0, 2)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, mask)
@ -2682,6 +2686,7 @@ ZEND_END_ARG_INFO()
const zend_function_entry basic_functions[] = { /* {{{ */
PHP_FE(constant, arginfo_constant)
PHP_FE(bin2hex, arginfo_bin2hex)
PHP_FE(hex2bin, arginfo_hex2bin)
PHP_FE(sleep, arginfo_sleep)
PHP_FE(usleep, arginfo_usleep)
#if HAVE_NANOSLEEP

View File

@ -78,6 +78,7 @@ PHP_FUNCTION(chunk_split);
PHP_FUNCTION(parse_str);
PHP_FUNCTION(str_getcsv);
PHP_FUNCTION(bin2hex);
PHP_FUNCTION(hex2bin);
PHP_FUNCTION(similar_text);
PHP_FUNCTION(strip_tags);
PHP_FUNCTION(str_repeat);

View File

@ -146,6 +146,46 @@ static char *php_bin2hex(const unsigned char *old, const size_t oldlen, size_t *
}
/* }}} */
/* {{{ php_hex2bin
*/
static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen)
{
size_t target_length = oldlen >> 1;
register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1);
size_t i, j;
for (i = j = 0; i < target_length; i++) {
char c = old[j++];
if (c >= '0' && c <= '9') {
str[i] = (c - '0') << 4;
} else if (c >= 'a' && c <= 'f') {
str[i] = (c - 'a' + 10) << 4;
} else if (c >= 'A' && c <= 'F') {
str[i] = (c - 'A' + 10) << 4;
} else {
efree(str);
return NULL;
}
c = old[j++];
if (c >= '0' && c <= '9') {
str[i] |= c - '0';
} else if (c >= 'a' && c <= 'f') {
str[i] |= c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
str[i] |= c - 'A' + 10;
} else {
efree(str);
return NULL;
}
}
str[target_length] = '\0';
if (newlen)
*newlen = target_length;
return (char *)str;
}
/* }}} */
#ifdef HAVE_LOCALECONV
/* {{{ localeconv_r
* glibc's localeconv is not reentrant, so lets make it so ... sorta */
@ -214,6 +254,28 @@ PHP_FUNCTION(bin2hex)
}
/* }}} */
/* {{{ proto string hex2bin(string data)
Converts the hex representation of data to binary */
PHP_FUNCTION(hex2bin)
{
char *result, *data;
size_t newlen;
int datalen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &datalen) == FAILURE) {
return;
}
result = php_hex2bin((unsigned char *)data, datalen, &newlen);
if (!result) {
RETURN_FALSE;
}
RETURN_STRINGL(result, newlen, 0);
}
/* }}} */
static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */
{
char *s11, *s22;