From 20d9ff5d3c4ac09f1f489eef4b0a4297983d9abd Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Thu, 17 Feb 2011 23:13:29 +0000 Subject: Ok, php can read and write gats style integers now. --- php/int.php | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 php/int.php (limited to 'php/int.php') diff --git a/php/int.php b/php/int.php new file mode 100644 index 0000000..478af73 --- /dev/null +++ b/php/int.php @@ -0,0 +1,108 @@ + $b ) + $b |= 0x80 | 0x40; + else + $b |= 0x40; + } + else + { + $b = ($iIn&0x3f); + if( $iIn > $b ) + $b |= 0x80; + } + + $ret .= chr( $b ); + $iIn = $iIn >> 6; + + while( $iIn > 0 ) + { + $b = ($iIn&0x7f); + if( $iIn > $b ) + $b |= 0x80; + $ret .= chr( $b ); + $iIn = $iIn >> 7; + } + + return $ret; +} */ + +function writeInt( $iIn ) +{ + $ret = ""; + if( gmp_cmp( $iIn, 0 ) < 0 ) + { + $iIn = gmp_mul( $iIn, -1 ); + $b = gmp_intval( gmp_and( $iIn, 0x3f ) ); + if( gmp_cmp( $iIn, $b ) > 0 ) + $b |= 0x80 | 0x40; + else + $b |= 0x40; + } + else + { + $b = gmp_intval( gmp_and( $iIn, 0x3f ) ); + if( gmp_cmp( $iIn, $b ) > 0 ) + $b |= 0x80; + } + + $ret .= chr( $b ); + $iIn = gmp_div( $iIn, 64 ); + + while( gmp_cmp( $iIn, 0 ) > 0 ) + { + $b = gmp_intval( gmp_and( $iIn, 0x7f ) ); + if( gmp_cmp( $iIn, $b ) > 0 ) + $b |= 0x80; + $ret .= chr( $b ); + $iIn = gmp_div( $iIn, 128 ); + } + + return $ret; +} + +function readInt( $sIn, &$pos ) +{ + $neg = false; + + $b = ord($sIn[$pos++]); + if( ($b&0x40) == 0x40 ) + $neg = true; + $iOut = gmp_init( $b&0x3f ); + $mult = gmp_init( 64 ); + while( ($b&0x80) ) + { + $b = ord($sIn[$pos++]); + $iOut = gmp_or( $iOut, gmp_mul( $b&0x7f, $mult ) ); + $mult = gmp_mul( $mult, 128 ); + } + if( $neg == true ) + $iOut = gmp_mul( $iOut, -1 ); + + return $iOut; +} + +function teststr( $str ) +{ + $pos = 0; + $enc = writeInt( $str ); + $out = gmp_strval( readInt( $enc, $pos ) ); + print( $str . " => " . $out ); + if( $out == $str ) + print(", correct.\n"); + else + print(", incorrect.\n"); +} +//print( bin2hex( writeInt("3898993999921") ) . "\n" ); +teststr("-7"); + + +?> -- cgit v1.2.3