求 "JScript.Encode" 的php decode 方法。 urldecode就可以了不过需要注意的是js的EncodeURI是采用utf-8编码的,你可能还需要做一次编码转换 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一天到晚都是唠叨你一个答我的问题啊,也答得很详细的,感谢了。其实我的目的就是为php 对 JS encode 的 decoder 而来。不过我还是不懂你的意思,例如下边的:<script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>通过浏览器解释后是:"hello,你好。"我就是想要浏览器对js encode的php解释方法。 <script language = JScript.Encode>原来你是指这个呀!过两天找出反编译的c代码给你看看,改写成php的应该没有问题的 一天到晚都是老大一个人答,且答得很详细,谢谢了。其实我刚才问的问题都是为php里对js encode 的decoder而来的。上边你的答复我还是不明白,我再说一下:例如:<script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>浏览器解释后:hello,你好。我就是想把那些字符串由php来解释。谢谢。 不好意思,我的机器缓冲区出了问题,重复回复了。是的,我在网上找到两分资料,一份是js 解释的,一分是 c 解释的。但我从人家的 js 里改过来却发现有些地方有问题的,例如 js 的 substr 函数和 php里的不同,例如如果它取1个中文字,会把整个中文字提取过来的。js 的 charCodeAt 也不对应php 的 ord 函数,这个 charCodeAt 问题就更大了,就是我刚才在 js 版里问的问题了。不过 js 转php 的我就差这两个函数没处理好。其他都处理好了,要不要我把完整的都发过来? 这个是网上的js原型:<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="ProgId" content="FrontPage.Editor.Document"><title>Welcome</title></head><SCRIPT language=javascript><!--function screncode(s,l){enc=new ActiveXObject("Scripting.Encoder");return enc.EncodeScriptFile("."+l,s,0,l+"cript");}var STATE_COPY_INPUT = 100var STATE_READLEN = 101var STATE_DECODE = 102var STATE_UNESCAPE = 103var pick_encoding = new Array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2)var rawData = new Array(0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F)var transformed = new Array()for (var i=0; i<3; i++) transformed[i] = new Array()for (var i=31; i<=126; i++) for (var j=0; j<3; j++) transformed[j][rawData[(i-31) * 3 + j]] = (i==31) ? 9 : ivar digits = new Array()for (var i=0; i<26; i++){digits["A".charCodeAt(0)+i] = idigits["a".charCodeAt(0)+i] = i+26}for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52digits[0x2b] = 62digits[0x2f] = 63function unescape(char){var escapes = "#&!*$"var escaped = "\r\n<>@"if (char.charCodeAt(0) > 126) ret = charelse if (escapes.indexOf(char) != -1) ret = escaped.substr(escapes.indexOf(char), 1)else ret = "?"return ret}function decodeBase64(string){var val = 0val += (digits[string.substr(0,1).charCodeAt(0)] << 2)val += (digits[string.substr(1,1).charCodeAt(0)] >> 4)val += (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)val += (digits[string.substr(3,1).charCodeAt(0)] << 16)return val}function strdec(encodingString){var er = "#@~^"var stringIndex = 0var scriptIndex = -1var unEncodingIndex = 0var char = nullvar encodingLength = unEncodinglength = 0var state = STATE_COPY_INPUTvar unEncodingString = ""var re, arrwhile(state){switch (state){case (STATE_COPY_INPUT) :scriptIndex = encodingString.indexOf(er, stringIndex)if (scriptIndex != -1){unEncodingString += encodingString.substring(stringIndex, scriptIndex)scriptIndex += er.lengthstate = STATE_READLEN}else{stringIndex = stringIndex==0 ? 0 : stringIndexunEncodingString += encodingString.substr(stringIndex, encodingString.length)state = 0}breakcase (STATE_READLEN) :encodingLength = encodingString.substr(scriptIndex, 6)unEncodinglength = decodeBase64(encodingLength)scriptIndex += (6 + "==".length)state = STATE_DECODEbreakcase (STATE_DECODE) :if (!unEncodinglength){stringIndex = scriptIndex + "DQgAAA==^#~@".lengthunEncodingIndex = 0state = STATE_COPY_INPUTbreak}char = encodingString.substr(scriptIndex, 1)if (char == "@") state = STATE_UNESCAPEelse{//document.write(char)//document.write(":")//document.write(char.charCodeAt(0))//document.write("<BR>")if (char.charCodeAt(0) < 0xFF){unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])unEncodingIndex++}else{unEncodingString += char} scriptIndex++unEncodinglength--break}case STATE_UNESCAPE:unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))scriptIndex++; unEncodinglength -=2unEncodingIndex++state = STATE_DECODEdocument.write(scriptIndex)break}}re = new RegExp("(JScript|VBscript).encode", "gmi")while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContextreturn unEncodingString}//--></SCRIPT><body><FORM method=post><P align=center><TEXTAREA name=codeinput rows="10" cols="43" >请在这里输入您要加密或解密的源码。</TEXTAREA><BR><BR><INPUT onclick="this.form.codeinput.value=screncode(this.form.codeinput.value,'JS')" type=button value=Encode加密> <INPUT onclick=this.form.codeinput.value=strdec(this.form.codeinput.value) type=button value=Encode解密> <BR></P></FORM></body></html> 这个是我改过来,但成功了一半的东西(如果没有中文则是没问题的):<?function mysubstr($str,$s_index,$length,$method){ $ret = ''; //javascript方法 if( $method == 'js' ){ for($i=$s_index;$i < $length;$i++){ $c_c = $str[$i]; //数字 if( ord($c_c) >= 48 && ord($c_c) <=57 ){ $ret .= $c_c; $length++; } //中文 elseif( ord($c_c) > 126 ){ $ret .= $c_c.$str[$i+1]; $length++; $i++; } } } else $ret = substr($str,$s_index,$length); return $ret;}/*function charcodeat($str,$index){ $chr = substr($str,$index,1); $ret = ord($chr); if( $ret > 126 ){ $ret *= 100; } //echo $chr.":".$ret."<BR>"; return $ret;}*/function unescape($char){ $escapes = "#&!*$"; $escaped = "\r\n<>@"; if (ord($char[0]) > 126) $ret = $char; else if (indexof($escapes,$char,0) != -1) $ret = substr($escaped,indexof($escapes,$char,0), 1); else $ret = "?"; return $ret;}function indexof($str,$match,$stringIndex){ if( $stringIndex > strlen($str) ) return -1; $des = strpos( substr($str,$stringIndex),$match,0); if( $des=="" && gettype($des)!='integer') return -1; return $des+$stringIndex;}function strdec($encodingString){ $pick_encoding = array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2); $rawData = array(0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72, 0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C, 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, 0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F, 0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E, 0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77, 0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78, 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, 0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25, 0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28, 0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36, 0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E, 0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09, 0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D, 0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37, 0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E, 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F); $transformed = array(); for($i=0; $i<3; $i++) $transformed[$i] = array(); for ($i=31; $i<=126; $i++) for ($j=0; $j<3; $j++) $transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i; $er = "#@~^"; $stringIndex = 0; $scriptIndex = -1; $unEncodingIndex = 0; $char = ''; $encodingLength = $unEncodinglength = 0; $state = 'STATE_COPY_INPUT'; $unEncodingString = ''; $re = ''; $arr = ''; //$df = 0; while($state){ switch($state){ case "STATE_COPY_INPUT" : $scriptIndex = indexof($encodingString,$er,$stringIndex); if ($scriptIndex != -1){ $unEncodingString .= substr($encodingString,$stringIndex, $scriptIndex); $scriptIndex += strlen($er); $state = "STATE_READLEN"; } else{ $stringIndex = $stringIndex==0 ? 0 : $stringIndex; $unEncodingString .= substr($encodingString,$stringIndex, strlen($encodingString) ); $state = 0; } break; case "STATE_READLEN" : $encodingLength = substr($encodingString,$scriptIndex, 6); $unEncodinglength = decodeBase64($encodingLength); $scriptIndex += (6 + strlen("==") ); $state = "STATE_DECODE"; break; case "STATE_DECODE" : if (!$unEncodinglength){ $stringIndex = $scriptIndex + strlen("DQgAAA==^#~@"); $unEncodingIndex = 0; $state = "STATE_COPY_INPUT"; break; } //$char = mysubstr($encodingString,$scriptIndex,1,'js'); $char = substr($encodingString,$scriptIndex,2); if ($char[0] == "@") $state = "STATE_UNESCAPE"; else{ if ( ord($char[0]) < 0xFF){ $unEncodingString .= chr($transformed[$pick_encoding[$unEncodingIndex%64]][ord($char[0])]); $unEncodingIndex++; } else{ $unEncodingString .= $char[0]; /* $df++; if( $df == 2 ){ $unEncodinglength++; $df = 0; } */ } $scriptIndex++; $unEncodinglength--; break; } case "STATE_UNESCAPE" : $unEncodingString .= unescape( substr($encodingString,++$scriptIndex, 1)); $scriptIndex++; $unEncodinglength -=2; $unEncodingIndex++; $state = "STATE_DECODE"; break; } } return $unEncodingString;}function decodeBase64($str){ $digits = array(); for ($i=0; $i<26; $i++){ $digits[ord('A')+$i] = $i; $digits[ord('a')+$i] = $i+26; } for ($i=0; $i<10; $i++) $digits[ord('0')+$i] = $i+52; $digits[0x2b] = 62; $digits[0x2f] = 63; $val = 0; $val += ($digits[ord($str[0])] << 2); $val += ($digits[ord($str[1])] >> 4); $val += ($digits[ord($str[1])] & 0xf) << 12; $val += (($digits[ord($str[2])] >> 2) << 8); $val += (($digits[ord($str[2])] & 0x3) << 22); $val += ($digits[ord($str[3])] << 16); return $val;}?> 毛病出在这里:js代码中有char = encodingString.substr(scriptIndex, 1)....if (char.charCodeAt(0) < 0xFF){unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])unEncodingIndex++}else{unEncodingString += char} 请注意到:.substr是按字截取而不是按字节截取,所以当遇到汉字时其值大于255(0xff)。而php的substr是按字节截取的,若是汉字则值大于127(0x7f)这里不能直译另外js的.indexOf方法也是按字处理的,你摹写的indexof函数并没有注意到这一点可参考c的写法.... if (inbuf[i] < 0x80) //这里处理基本ascii字符 { outbuf[j++] = c = transformed[pick_encoding][m%64]][inbuf[i]]; csum += c; m++; } else { //这里处理扩展ascii字符 outbuf[j++] = inbuf[i]; if ((cp) && (isLeadByte (cp,inbuf[i]))) //检查是否是东方文字编码 state = STATE_DBCS; } } i++; len--; break; case STATE_DBCS: //处理东方文字的代码段 outbuf[j++] = inbuf[i++]; state = STATE_DECODE;由于php与c及其相似,所以从c代码改写要比从js改写要容易的多 break; 不要费神了,我提供两个版本。刚写好。<?php/** 模拟js字符串方法 **/function js_charCodeAt($string, $index) { if(strlen($string) <= $index) return 'NaN'; for($i=0,$j=0; $i<$index; $i++,$j++) { if(ord($string[$j]) >= 0x80) $j++; } $ch = $string[$j]; if(ord($ch) >= 0x80) { $ch .= $string[$j+1]; list(, $n) = unpack('n', $ch); }else $n = ord($ch); return $n;}function js_indexOf($string, $substring, $index=0) { if(empty($substring)) return -1; if($index >= strlen($string)) return -1; $j = 0; if($index > 0) { for($i=0,$j=0; $i<$index; $i++,$j++) { if(ord($string[$j]) >= 0x80) $j++; } } if($j >= strlen($string)) return -1; $n = strpos(substr($string, $j), $substring); if($n === false) return -1; $index += $n; for(; $j<$n; $j++) { if(ord($string[$j]) >= 0x80) { $index--; $j++; } } return $index;}function js_substr($string, $start=0, $len=0) { if($strrt == 0 && $len == 0) return $string; $j = 0; if($start > 0) { for($i=0,$j=0; $i<$start; $i++,$j++) { if(ord($string[$j]) >= 0x80) $j++; } } if($len == 0) return substr($string, $j); $ret = ''; for(; $j<strlen($string) && $i<$start+$len; $i++,$j++) { $ch = $string[$j]; if(ord($ch) >= 0x80) { $j++; $ch .= $string[$j]; } $ret .= $ch; } return $ret;}function js_substring($string, $start, $end) { if($start < 0) $start = 0; if($end < 0) $end = 0; if($start == $end) return ''; if($end < $start) list($start, $end) = array($end, $start); $j = 0; $i = 0; if($start > 0) { for($i=0,$j=0; $i<$start; $i++,$j++) { if(ord($string[$j]) >= 0x80) $j++; } } $ret = ''; for(; $j<strlen($string) && $i<$end; $i++,$j++) { $ch = $string[$j]; if(ord($ch) >= 0x80) { $j++; $ch .= $string[$j]; } $ret .= $ch; } return $ret;}function js_fromCharCode() { $ret = ''; foreach(func_get_args() as $v) { if($v < 0x80) $ret .= chr($v); else $ret .= pack('S', $v); } return $ret;}?><?php/** 解码程序 从你提供的js代码移植 **/define('STATE_COPY_INPUT', 100);define('STATE_READLEN', 101);define('STATE_DECODE', 102);define('STATE_UNESCAPE', 103);$pick_encoding = array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2);$rawData = array(0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F);$transformed = array();for ($i=0; $i<3; $i++) $transformed[$i] = array();for ($i=31; $i<=126; $i++) for ($j=0; $j<3; $j++) $transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i;$digits = array();for ($i=0; $i<26; $i++) { $digits[js_charCodeAt("A", 0)+$i] = $i; $digits[js_charCodeAt("a", 0)+$i] = $i+26;}for ($i=0; $i<10; $i++) $digits[js_charCodeAt("0", 0)+$i] = $i+52;$digits[0x2b] = 62;$digits[0x2f] = 63;function unescape($char) { $escapes = "#&!*$"; $escaped = "\r\n<>@"; if (js_charCodeAt($char, 0) > 126) $ret = $char; else if (js_indexOf($escapes, $char) != -1) $ret = js_substr($escaped, js_indexOf($escapes, $char), 1); else $ret = "?"; return $ret;}function decodeBase64($string) { global $digits; $val = 0; $val += $digits[js_charCodeAt(js_substr($string, 0, 1), 0)] << 2; $val += $digits[js_charCodeAt(js_substr($string, 1, 1), 0)] >> 4; $val += ($digits[js_charCodeAt(js_substr($string, 1, 1), 0)] & 0xf) << 12; $val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] >> 2) << 8; $val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] &0x3) << 22; $val += $digits[js_charCodeAt(js_substr($string, 3, 1), 0)] << 16; return $val;}function strdec($encodingString) { global $transformed, $pick_encoding; $er = "#@~^"; $stringIndex = 0; $scriptIndex = -1; $unEncodingIndex = 0; $char = null; $encodingLength = $unEncodinglength = 0; $state = STATE_COPY_INPUT; $unEncodingString = ""; while($state) { switch ($state) { case STATE_COPY_INPUT : $scriptIndex = js_indexOf($encodingString, $er, $stringIndex); if ($scriptIndex != -1) { $unEncodingString .= js_substring($encodingString, $stringIndex, $scriptIndex); $scriptIndex += strlen($er); $state = STATE_READLEN; }else { $stringIndex = $stringIndex==0 ? 0 : $stringIndex; $unEncodingString .= js_substr($encodingString, $stringIndex, strlen($encodingString)); $state = 0; } break; case STATE_READLEN : $encodingLength = js_substr($encodingString, $scriptIndex, 6); $unEncodinglength .= decodeBase64($encodingLength); $scriptIndex += 6 + strlen("=="); $state = STATE_DECODE; break; case STATE_DECODE : if (!$unEncodinglength) { $stringIndex = $scriptIndex + strlen("DQgAAA==^#~@"); $unEncodingIndex = 0; $state = STATE_COPY_INPUT; break; } $char = js_substr($encodingString, $scriptIndex, 1); if ($char == "@") $state = STATE_UNESCAPE; else { if (js_charCodeAt($char, 0) < 0xFF) { $unEncodingString .= js_fromCharCode($transformed[$pick_encoding[$unEncodingIndex%64]][js_charCodeAt($char, 0)]); $unEncodingIndex++; }else { $unEncodingString .= $char; } $scriptIndex++; $unEncodinglength --; break; } case STATE_UNESCAPE: $unEncodingString .= unescape(js_substr($encodingString, ++$scriptIndex, 1)); $scriptIndex++; $unEncodinglength -= 2; $unEncodingIndex++; $state = STATE_DECODE; break; } } return $unEncodingString;}?> <?phperror_reporting(E_ALL);function ScriptEncode($code) { $ec = new com('Scripting.Encoder'); return $ec->EncodeScriptFile('.js', $code, 0, 'jscript');}/** 解码 从C程序移植 **/define('LEN_OUTBUF', 64);define('LEN_INBUF', 1024);define('STATE_INIT_COPY', 100);define('STATE_COPY_INPUT', 101);define('STATE_SKIP_ML', 102);define('STATE_CHECKSUM', 103);define('STATE_READLEN', 104);define('STATE_DECODE', 105);define('STATE_UNESCAPE', 106);define('STATE_FLUSHING', 107);define('STATE_DBCS', 108);define('STATE_INIT_READLEN', 109);$rawData = array( 0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72, 0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C, 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43, 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63, 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79, 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B, 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D, 0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F, 0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E, 0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77, 0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78, 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67, 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22, 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A, 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C, 0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25, 0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28, 0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36, 0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E, 0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09, 0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D, 0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37, 0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E, 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F, 0x51,0x67,0x2f);$pick_encoding = array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2);$transformed = array(); for ($i=31; $i<=127; $i++) for ($j=0; $j<3; $j++) $transformed[$j][$rawData[($i-31)*3 + $j]] = ($i==31) ? 9 : $i;$digits = array(); for ($i=0; $i<26; $i++) { $digits[ord('A')+$i] = $i; $digits[ord('a')+$i] = $i+26; } for ($i=0; $i<10; $i++) $digits[ord('0')+$i] = $i+52; $digits[0x2b] = 62; $digits[0x2f] = 63;function unescape($c) { $escapes = "#&!*$"; $escaped = "\r\n<>@"; $i = 0; if (ord($c) > 127) return $c; while ($i < strlen($escapes)) { if ($escapes[$i] == $c) return $escaped[$i]; $i++; } return '?';}function decodeBase64 ($p) { global $digits; $val = 0; $val += ($digits[ord($p[0])] << 2); $val += ($digits[ord($p[1])] >> 4); $val += ($digits[ord($p[1])] & 0xf) << 12; $val += (($digits[ord($p[2])] >> 2) << 8); $val += (($digits[ord($p[2])] & 0x3) << 22); $val += ($digits[ord($p[3])] << 16); $val += (($digits[ord($p[4])] << 2) << 24); $val += (($digits[ord($p[5])] >> 4) << 24); /* 543210 543210 543210 543210 543210 543210 765432 10 ba98 fedc 76 543210 fedcba 98---- |- LSB -||- -||- -| |- MSB -| */ return $val;} function isLeadByte ($cp, $ucByte) { /* Code page 932 - Japanese Shift-JIS - 0x81-0x9f 0xe0-0xfc 936 - Simplified Chinese GBK - 0xa1-0xfe 949 - Korean Wansung - 0x81-0xfe 950 - Traditional Chinese Big5 - 0x81-0xfe 1361 - Korean Johab - 0x84-0xd3 0xd9-0xde 0xe0-0xf9 */ $ucByte = ord($ucByte); switch ($cp) { case 932: if (($ucByte > 0x80) && ($ucByte < 0xa0)) return 1; if (($ucByte > 0xdf) && ($ucByte < 0xfd)) return 1; else return 0; case 936:// if (($ucByte > 0xa0) && ($ucByte < 0xff)) return 1;// else return 0; case 949: case 950: if (($ucByte > 0x80) && ($ucByte < 0xff)) return 1; else return 0; case 1361: if (($ucByte > 0x83) && ($ucByte < 0xd4)) return 1; if (($ucByte > 0xd8) && ($ucByte < 0xdf)) return 1; if (($ucByte > 0xdf) && ($ucByte < 0xfa)) return 1; else return 0; default: return 0; }}function ScriptDecoder ($inname, $outname='', $cp) { global $transformed, $pick_encoding; $inbuf = ''; //[LEN_INBUF+1]; $outbuf = array(); //[LEN_OUTBUF+1]; $er = "#@~^"; $nextstate = 0; $state = 0; $csum = 0; $len = 0; if(is_file($inname)) $inbuf = file_get_contents($inname); else $inbuf = $inname; $state = STATE_INIT_COPY; $i = 0; $j = 0; while ($state) { if ($i == strlen($inbuf)) { break; } switch ($state) { case STATE_INIT_COPY: $ml = strlen ($er); $m = 0; $state = STATE_COPY_INPUT; break; case STATE_COPY_INPUT: if ($inbuf[$i] == $er[$m]) { $i++; $m++; }else { if ($m) { $k = 0; $state = STATE_FLUSHING; }else $outbuf[$j++] = $inbuf[$i++]; } if ($m == $ml) $state = STATE_INIT_READLEN; break; case STATE_FLUSHING: $outbuf[$j++] = $er[$k++]; $m--; if ($m==0) $state = STATE_COPY_INPUT; break; case STATE_SKIP_ML: $i++; if (!(--$ml)) $state = $nextstate; break; case STATE_INIT_READLEN: $ml = 6; $state = STATE_READLEN; break; case STATE_READLEN: $lenbuf[6-$ml] = $inbuf[$i++]; if (!(--$ml)) { $len = decodeBase64 ($lenbuf); $m = 0; $ml = 2; $state = STATE_SKIP_ML; $nextstate = STATE_DECODE; } break; case STATE_DECODE: if (!$len) { $ml = 6; $state = STATE_CHECKSUM; break; } if ($inbuf[$i] == '@') $state = STATE_UNESCAPE; else { if (ord($inbuf[$i]) < 0x80) { $outbuf[$j++] = $c = chr($transformed[$pick_encoding[$m%64]][ord($inbuf[$i])]); $csum += ord($c); $m++; }else { $outbuf[$j++] = $inbuf[$i]; if (($cp) && (isLeadByte ($cp,$inbuf[$i]))) $state = STATE_DBCS; } } $i++; $len--; break; case STATE_DBCS: $outbuf[$j++] = $inbuf[$i++]; $state = STATE_DECODE; break; case STATE_UNESCAPE: $outbuf[$j++] = $c = unescape ($inbuf[$i++]); $csum += ord($c); $len--; $m++; $state = STATE_DECODE; break; case STATE_CHECKSUM: $csbuf[6-$ml] = $inbuf[$i++]; if (!(--$ml)) { $csum -= decodeBase64 ($csbuf); if ($csum) { printf ("Error - Incorrect checksum! (%lu)\n", $csum); $csum=0; } $m = 0; $ml = 6; $state = STATE_SKIP_ML; $nextstate = STATE_INIT_COPY; } break; default: printf ("Invalid state: %d\n", $state); break; } } if($outname) file_put_contents ($outname, $outbuf); return join('', $outbuf);}$js = <<< JSvar a=1;for(i=0; i<10; i++) document.write('a测试'+i+'<br>');JS;$s = ScriptEncode($js);echo ScriptDecoder($s, '', 936);?>你可以比较一下,从c移植的运行速度要快很多 http://blog.csdn.net/ezdevelop/archive/2005/06/15/394771.aspx == 的问题 求助:php源码加密工具? 怎样把输出的数据读到数据库中 php5函数详解的帮助文档 如何做一个简单的php网页,访问这个网页,就自动访问多个自定义的URL链接? php在web页面上传时候的问题 mysql只读的问题 问两个初级问题,希望帮忙,明天一定结贴! $_ENV不能显示. 我在 win2000 下安装了 pear ,但是路径老是出问题!请大虾指点 奇怪问题,我升级phpmyadmin后,如果不输入index.php,就会出现Index of /phpmyadmin,而不是进入phpmyadmin 如何实现网页得自动跳转?很菜得问题,见笑了!
例如下边的:
<script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>
通过浏览器解释后是:"hello,你好。"
我就是想要浏览器对js encode的php解释方法。
上边你的答复我还是不明白,我再说一下:
例如:
<script language = JScript.Encode>#@~^GwAAAA==[Km;s+ YRSDbO+vJ4+^VGS你好。r#jQgAAA==^#~@</script>
浏览器解释后:
hello,你好。我就是想把那些字符串由php来解释。谢谢。
是的,我在网上找到两分资料,一份是js 解释的,一分是 c 解释的。
但我从人家的 js 里改过来却发现有些地方有问题的,例如 js 的 substr 函数和 php里的不同,例如如果它取1个中文字,会把整个中文字提取过来的。js 的 charCodeAt 也不对应php 的 ord 函数,这个 charCodeAt 问题就更大了,就是我刚才在 js 版里问的问题了。不过 js 转php 的我就差这两个函数没处理好。其他都处理好了,要不要我把完整的都发过来?
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Welcome</title>
</head>
<SCRIPT language=javascript>
<!--
function screncode(s,l)
{enc=new ActiveXObject("Scripting.Encoder");
return enc.EncodeScriptFile("."+l,s,0,l+"cript");
}
var STATE_COPY_INPUT = 100
var STATE_READLEN = 101
var STATE_DECODE = 102
var STATE_UNESCAPE = 103var pick_encoding = new Array(
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
)var rawData = new Array(
0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
)var transformed = new Array()
for (var i=0; i<3; i++) transformed[i] = new Array()
for (var i=31; i<=126; i++) for (var j=0; j<3; j++) transformed[j][rawData[(i-31) * 3 + j]] = (i==31) ? 9 : ivar digits = new Array()
for (var i=0; i<26; i++)
{
digits["A".charCodeAt(0)+i] = i
digits["a".charCodeAt(0)+i] = i+26
}
for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52
digits[0x2b] = 62
digits[0x2f] = 63function unescape(char)
{
var escapes = "#&!*$"
var escaped = "\r\n<>@"
if (char.charCodeAt(0) > 126) ret = char
else if (escapes.indexOf(char) != -1) ret = escaped.substr(escapes.indexOf(char), 1)
else ret = "?"return ret
}function decodeBase64(string)
{
var val = 0
val += (digits[string.substr(0,1).charCodeAt(0)] << 2)
val += (digits[string.substr(1,1).charCodeAt(0)] >> 4)
val += (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12
val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)
val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)
val += (digits[string.substr(3,1).charCodeAt(0)] << 16)
return val
}function strdec(encodingString)
{var er = "#@~^"
var stringIndex = 0
var scriptIndex = -1
var unEncodingIndex = 0
var char = null
var encodingLength = unEncodinglength = 0
var state = STATE_COPY_INPUT
var unEncodingString = ""
var re, arrwhile(state)
{
switch (state)
{
case (STATE_COPY_INPUT) :
scriptIndex = encodingString.indexOf(er, stringIndex)
if (scriptIndex != -1)
{
unEncodingString += encodingString.substring(stringIndex, scriptIndex)
scriptIndex += er.length
state = STATE_READLEN
}
else
{
stringIndex = stringIndex==0 ? 0 : stringIndex
unEncodingString += encodingString.substr(stringIndex, encodingString.length)
state = 0
}
breakcase (STATE_READLEN) :
encodingLength = encodingString.substr(scriptIndex, 6)
unEncodinglength = decodeBase64(encodingLength)
scriptIndex += (6 + "==".length)state = STATE_DECODE
breakcase (STATE_DECODE) :
if (!unEncodinglength)
{
stringIndex = scriptIndex + "DQgAAA==^#~@".length
unEncodingIndex = 0
state = STATE_COPY_INPUT
break
}
char = encodingString.substr(scriptIndex, 1)if (char == "@") state = STATE_UNESCAPE
else
{
//document.write(char)
//document.write(":")
//document.write(char.charCodeAt(0))
//document.write("<BR>")if (char.charCodeAt(0) < 0xFF)
{
unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
unEncodingIndex++
}
else
{
unEncodingString += char
}
scriptIndex++
unEncodinglength--
break
}case STATE_UNESCAPE:
unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))
scriptIndex++; unEncodinglength -=2
unEncodingIndex++
state = STATE_DECODE
document.write(scriptIndex)
break
}
}re = new RegExp("(JScript|VBscript).encode", "gmi")
while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext
return unEncodingString
}//-->
</SCRIPT>
<body>
<FORM method=post>
<P align=center>
<TEXTAREA name=codeinput rows="10" cols="43" >请在这里输入您要加密或解密的源码。</TEXTAREA><BR><BR><INPUT onclick="this.form.codeinput.value=screncode(this.form.codeinput.value,'JS')" type=button value=Encode加密>
<INPUT onclick=this.form.codeinput.value=strdec(this.form.codeinput.value) type=button value=Encode解密>
<BR></P>
</FORM></body>
</html>
<?
function mysubstr($str,$s_index,$length,$method){
$ret = '';
//javascript方法
if( $method == 'js' ){
for($i=$s_index;$i < $length;$i++){
$c_c = $str[$i];
//数字
if( ord($c_c) >= 48 && ord($c_c) <=57 ){
$ret .= $c_c;
$length++;
}
//中文
elseif( ord($c_c) > 126 ){
$ret .= $c_c.$str[$i+1];
$length++;
$i++;
}
}
}
else $ret = substr($str,$s_index,$length);
return $ret;
}/*
function charcodeat($str,$index){
$chr = substr($str,$index,1);
$ret = ord($chr);
if( $ret > 126 ){
$ret *= 100;
}
//echo $chr.":".$ret."<BR>";
return $ret;
}*/function unescape($char){
$escapes = "#&!*$";
$escaped = "\r\n<>@";
if (ord($char[0]) > 126) $ret = $char;
else if (indexof($escapes,$char,0) != -1) $ret = substr($escaped,indexof($escapes,$char,0), 1);
else $ret = "?";
return $ret;
}function indexof($str,$match,$stringIndex){
if( $stringIndex > strlen($str) ) return -1;
$des = strpos( substr($str,$stringIndex),$match,0);
if( $des=="" && gettype($des)!='integer') return -1;
return $des+$stringIndex;
}function strdec($encodingString){
$pick_encoding = array(1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2); $rawData = array(0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F); $transformed = array();
for($i=0; $i<3; $i++) $transformed[$i] = array();
for ($i=31; $i<=126; $i++) for ($j=0; $j<3; $j++) $transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i; $er = "#@~^";
$stringIndex = 0;
$scriptIndex = -1;
$unEncodingIndex = 0;
$char = '';
$encodingLength = $unEncodinglength = 0;
$state = 'STATE_COPY_INPUT';
$unEncodingString = '';
$re = '';
$arr = '';
//$df = 0; while($state){
switch($state){
case "STATE_COPY_INPUT" :
$scriptIndex = indexof($encodingString,$er,$stringIndex);
if ($scriptIndex != -1){
$unEncodingString .= substr($encodingString,$stringIndex, $scriptIndex);
$scriptIndex += strlen($er);
$state = "STATE_READLEN";
}
else{
$stringIndex = $stringIndex==0 ? 0 : $stringIndex;
$unEncodingString .= substr($encodingString,$stringIndex, strlen($encodingString) );
$state = 0;
}
break; case "STATE_READLEN" :
$encodingLength = substr($encodingString,$scriptIndex, 6);
$unEncodinglength = decodeBase64($encodingLength);
$scriptIndex += (6 + strlen("==") );
$state = "STATE_DECODE";
break; case "STATE_DECODE" :
if (!$unEncodinglength){
$stringIndex = $scriptIndex + strlen("DQgAAA==^#~@");
$unEncodingIndex = 0;
$state = "STATE_COPY_INPUT";
break;
} //$char = mysubstr($encodingString,$scriptIndex,1,'js'); $char = substr($encodingString,$scriptIndex,2);
if ($char[0] == "@") $state = "STATE_UNESCAPE";
else{
if ( ord($char[0]) < 0xFF){
$unEncodingString .= chr($transformed[$pick_encoding[$unEncodingIndex%64]][ord($char[0])]);
$unEncodingIndex++;
}
else{
$unEncodingString .= $char[0];
/*
$df++;
if( $df == 2 ){
$unEncodinglength++;
$df = 0;
}
*/
}
$scriptIndex++;
$unEncodinglength--;
break;
} case "STATE_UNESCAPE" :
$unEncodingString .= unescape( substr($encodingString,++$scriptIndex, 1));
$scriptIndex++;
$unEncodinglength -=2;
$unEncodingIndex++;
$state = "STATE_DECODE"; break;
}
}
return $unEncodingString;
}function decodeBase64($str){
$digits = array();
for ($i=0; $i<26; $i++){
$digits[ord('A')+$i] = $i;
$digits[ord('a')+$i] = $i+26;
}
for ($i=0; $i<10; $i++) $digits[ord('0')+$i] = $i+52;
$digits[0x2b] = 62;
$digits[0x2f] = 63; $val = 0;
$val += ($digits[ord($str[0])] << 2);
$val += ($digits[ord($str[1])] >> 4);
$val += ($digits[ord($str[1])] & 0xf) << 12;
$val += (($digits[ord($str[2])] >> 2) << 8);
$val += (($digits[ord($str[2])] & 0x3) << 22);
$val += ($digits[ord($str[3])] << 16);
return $val;
}
?>
char = encodingString.substr(scriptIndex, 1)
....
if (char.charCodeAt(0) < 0xFF)
{
unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
unEncodingIndex++
}
else
{
unEncodingString += char
}
请注意到:
.substr是按字截取而不是按字节截取,所以当遇到汉字时其值大于255(0xff)。而php的substr是按字节截取的,若是汉字则值大于127(0x7f)
这里不能直译
另外js的.indexOf方法也是按字处理的,你摹写的indexof函数并没有注意到这一点可参考c的写法
....
if (inbuf[i] < 0x80) //这里处理基本ascii字符
{
outbuf[j++] = c = transformed[pick_encoding][m%64]][inbuf[i]];
csum += c;
m++;
}
else
{ //这里处理扩展ascii字符
outbuf[j++] = inbuf[i];
if ((cp) && (isLeadByte (cp,inbuf[i]))) //检查是否是东方文字编码
state = STATE_DBCS;
} }
i++;
len--;
break; case STATE_DBCS: //处理东方文字的代码段
outbuf[j++] = inbuf[i++];
state = STATE_DECODE;由于php与c及其相似,所以从c代码改写要比从js改写要容易的多 break;
/** 模拟js字符串方法 **/
function js_charCodeAt($string, $index) {
if(strlen($string) <= $index) return 'NaN';
for($i=0,$j=0; $i<$index; $i++,$j++) {
if(ord($string[$j]) >= 0x80) $j++;
}
$ch = $string[$j];
if(ord($ch) >= 0x80) {
$ch .= $string[$j+1];
list(, $n) = unpack('n', $ch);
}else $n = ord($ch);
return $n;
}function js_indexOf($string, $substring, $index=0) {
if(empty($substring)) return -1;
if($index >= strlen($string)) return -1;
$j = 0;
if($index > 0) {
for($i=0,$j=0; $i<$index; $i++,$j++) {
if(ord($string[$j]) >= 0x80) $j++;
}
}
if($j >= strlen($string)) return -1;
$n = strpos(substr($string, $j), $substring);
if($n === false) return -1;
$index += $n;
for(; $j<$n; $j++) {
if(ord($string[$j]) >= 0x80) {
$index--;
$j++;
}
}
return $index;
}function js_substr($string, $start=0, $len=0) {
if($strrt == 0 && $len == 0) return $string;
$j = 0;
if($start > 0) {
for($i=0,$j=0; $i<$start; $i++,$j++) {
if(ord($string[$j]) >= 0x80) $j++;
}
}
if($len == 0) return substr($string, $j);
$ret = '';
for(; $j<strlen($string) && $i<$start+$len; $i++,$j++) {
$ch = $string[$j];
if(ord($ch) >= 0x80) {
$j++;
$ch .= $string[$j];
}
$ret .= $ch;
}
return $ret;
}function js_substring($string, $start, $end) {
if($start < 0) $start = 0;
if($end < 0) $end = 0;
if($start == $end) return '';
if($end < $start) list($start, $end) = array($end, $start);
$j = 0;
$i = 0;
if($start > 0) {
for($i=0,$j=0; $i<$start; $i++,$j++) {
if(ord($string[$j]) >= 0x80) $j++;
}
}
$ret = '';
for(; $j<strlen($string) && $i<$end; $i++,$j++) {
$ch = $string[$j];
if(ord($ch) >= 0x80) {
$j++;
$ch .= $string[$j];
}
$ret .= $ch;
}
return $ret;
}function js_fromCharCode() {
$ret = '';
foreach(func_get_args() as $v) {
if($v < 0x80)
$ret .= chr($v);
else
$ret .= pack('S', $v);
}
return $ret;
}
?>
<?php
/** 解码程序 从你提供的js代码移植 **/
define('STATE_COPY_INPUT', 100);
define('STATE_READLEN', 101);
define('STATE_DECODE', 102);
define('STATE_UNESCAPE', 103);$pick_encoding = array(
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
);$rawData = array(
0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
);$transformed = array();
for ($i=0; $i<3; $i++) $transformed[$i] = array();
for ($i=31; $i<=126; $i++)
for ($j=0; $j<3; $j++)
$transformed[$j][$rawData[($i-31) * 3 + $j]] = ($i==31) ? 9 : $i;$digits = array();
for ($i=0; $i<26; $i++) {
$digits[js_charCodeAt("A", 0)+$i] = $i;
$digits[js_charCodeAt("a", 0)+$i] = $i+26;
}
for ($i=0; $i<10; $i++) $digits[js_charCodeAt("0", 0)+$i] = $i+52;
$digits[0x2b] = 62;
$digits[0x2f] = 63;function unescape($char) {
$escapes = "#&!*$";
$escaped = "\r\n<>@"; if (js_charCodeAt($char, 0) > 126) $ret = $char;
else if (js_indexOf($escapes, $char) != -1) $ret = js_substr($escaped, js_indexOf($escapes, $char), 1);
else $ret = "?"; return $ret;
}function decodeBase64($string) {
global $digits;
$val = 0;
$val += $digits[js_charCodeAt(js_substr($string, 0, 1), 0)] << 2;
$val += $digits[js_charCodeAt(js_substr($string, 1, 1), 0)] >> 4;
$val += ($digits[js_charCodeAt(js_substr($string, 1, 1), 0)] & 0xf) << 12;
$val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] >> 2) << 8;
$val += ($digits[js_charCodeAt(js_substr($string, 2, 1), 0)] &0x3) << 22;
$val += $digits[js_charCodeAt(js_substr($string, 3, 1), 0)] << 16;
return $val;
}function strdec($encodingString) {
global $transformed, $pick_encoding;
$er = "#@~^";
$stringIndex = 0;
$scriptIndex = -1;
$unEncodingIndex = 0;
$char = null;
$encodingLength = $unEncodinglength = 0;
$state = STATE_COPY_INPUT;
$unEncodingString = ""; while($state) {
switch ($state) {
case STATE_COPY_INPUT :
$scriptIndex = js_indexOf($encodingString, $er, $stringIndex);
if ($scriptIndex != -1) {
$unEncodingString .= js_substring($encodingString, $stringIndex, $scriptIndex);
$scriptIndex += strlen($er);
$state = STATE_READLEN;
}else {
$stringIndex = $stringIndex==0 ? 0 : $stringIndex;
$unEncodingString .= js_substr($encodingString, $stringIndex, strlen($encodingString));
$state = 0;
}
break; case STATE_READLEN :
$encodingLength = js_substr($encodingString, $scriptIndex, 6);
$unEncodinglength .= decodeBase64($encodingLength);
$scriptIndex += 6 + strlen("==");
$state = STATE_DECODE;
break; case STATE_DECODE :
if (!$unEncodinglength) {
$stringIndex = $scriptIndex + strlen("DQgAAA==^#~@");
$unEncodingIndex = 0;
$state = STATE_COPY_INPUT;
break;
}
$char = js_substr($encodingString, $scriptIndex, 1);
if ($char == "@") $state = STATE_UNESCAPE;
else {
if (js_charCodeAt($char, 0) < 0xFF) {
$unEncodingString .= js_fromCharCode($transformed[$pick_encoding[$unEncodingIndex%64]][js_charCodeAt($char, 0)]);
$unEncodingIndex++;
}else {
$unEncodingString .= $char;
}
$scriptIndex++;
$unEncodinglength --;
break;
}
case STATE_UNESCAPE:
$unEncodingString .= unescape(js_substr($encodingString, ++$scriptIndex, 1));
$scriptIndex++;
$unEncodinglength -= 2;
$unEncodingIndex++;
$state = STATE_DECODE;
break;
}
}
return $unEncodingString;
}
?>
error_reporting(E_ALL);function ScriptEncode($code) {
$ec = new com('Scripting.Encoder');
return $ec->EncodeScriptFile('.js', $code, 0, 'jscript');
}/** 解码 从C程序移植 **/
define('LEN_OUTBUF', 64);
define('LEN_INBUF', 1024);define('STATE_INIT_COPY', 100);
define('STATE_COPY_INPUT', 101);
define('STATE_SKIP_ML', 102);
define('STATE_CHECKSUM', 103);
define('STATE_READLEN', 104);
define('STATE_DECODE', 105);
define('STATE_UNESCAPE', 106);
define('STATE_FLUSHING', 107);
define('STATE_DBCS', 108);
define('STATE_INIT_READLEN', 109);$rawData = array(
0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F,
0x51,0x67,0x2f
);$pick_encoding = array(
1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
);$transformed = array();
for ($i=31; $i<=127; $i++)
for ($j=0; $j<3; $j++)
$transformed[$j][$rawData[($i-31)*3 + $j]] = ($i==31) ? 9 : $i;
$digits = array();
for ($i=0; $i<26; $i++) {
$digits[ord('A')+$i] = $i;
$digits[ord('a')+$i] = $i+26;
}
for ($i=0; $i<10; $i++)
$digits[ord('0')+$i] = $i+52;
$digits[0x2b] = 62;
$digits[0x2f] = 63;function unescape($c) {
$escapes = "#&!*$";
$escaped = "\r\n<>@";
$i = 0; if (ord($c) > 127)
return $c;
while ($i < strlen($escapes)) {
if ($escapes[$i] == $c)
return $escaped[$i];
$i++;
}
return '?';
}function decodeBase64 ($p) {
global $digits;
$val = 0;
$val += ($digits[ord($p[0])] << 2);
$val += ($digits[ord($p[1])] >> 4);
$val += ($digits[ord($p[1])] & 0xf) << 12;
$val += (($digits[ord($p[2])] >> 2) << 8);
$val += (($digits[ord($p[2])] & 0x3) << 22);
$val += ($digits[ord($p[3])] << 16);
$val += (($digits[ord($p[4])] << 2) << 24);
$val += (($digits[ord($p[5])] >> 4) << 24); /* 543210 543210 543210 543210 543210 543210 765432
10
ba98
fedc
76
543210
fedcba 98----
|- LSB -||- -||- -| |- MSB -|
*/
return $val;
}
/* Code page 932 - Japanese Shift-JIS - 0x81-0x9f
0xe0-0xfc
936 - Simplified Chinese GBK - 0xa1-0xfe
949 - Korean Wansung - 0x81-0xfe
950 - Traditional Chinese Big5 - 0x81-0xfe
1361 - Korean Johab - 0x84-0xd3
0xd9-0xde
0xe0-0xf9 */
$ucByte = ord($ucByte);
switch ($cp) {
case 932:
if (($ucByte > 0x80) && ($ucByte < 0xa0)) return 1;
if (($ucByte > 0xdf) && ($ucByte < 0xfd)) return 1;
else return 0;
case 936:
// if (($ucByte > 0xa0) && ($ucByte < 0xff)) return 1;
// else return 0;
case 949:
case 950:
if (($ucByte > 0x80) && ($ucByte < 0xff)) return 1;
else return 0;
case 1361:
if (($ucByte > 0x83) && ($ucByte < 0xd4)) return 1;
if (($ucByte > 0xd8) && ($ucByte < 0xdf)) return 1;
if (($ucByte > 0xdf) && ($ucByte < 0xfa)) return 1;
else return 0;
default:
return 0;
}
}
function ScriptDecoder ($inname, $outname='', $cp) {
global $transformed, $pick_encoding;
$inbuf = ''; //[LEN_INBUF+1];
$outbuf = array(); //[LEN_OUTBUF+1];
$er = "#@~^";
$nextstate = 0;
$state = 0;
$csum = 0;
$len = 0; if(is_file($inname))
$inbuf = file_get_contents($inname);
else
$inbuf = $inname;
$state = STATE_INIT_COPY;
$i = 0;
$j = 0; while ($state) {
if ($i == strlen($inbuf)) {
break;
} switch ($state) {
case STATE_INIT_COPY:
$ml = strlen ($er);
$m = 0;
$state = STATE_COPY_INPUT;
break; case STATE_COPY_INPUT:
if ($inbuf[$i] == $er[$m]) {
$i++;
$m++;
}else {
if ($m) {
$k = 0;
$state = STATE_FLUSHING;
}else
$outbuf[$j++] = $inbuf[$i++];
}
if ($m == $ml)
$state = STATE_INIT_READLEN;
break; case STATE_FLUSHING:
$outbuf[$j++] = $er[$k++];
$m--;
if ($m==0)
$state = STATE_COPY_INPUT;
break;
case STATE_SKIP_ML:
$i++;
if (!(--$ml))
$state = $nextstate;
break; case STATE_INIT_READLEN:
$ml = 6;
$state = STATE_READLEN;
break; case STATE_READLEN:
$lenbuf[6-$ml] = $inbuf[$i++];
if (!(--$ml)) {
$len = decodeBase64 ($lenbuf);
$m = 0;
$ml = 2;
$state = STATE_SKIP_ML;
$nextstate = STATE_DECODE;
}
break; case STATE_DECODE:
if (!$len) {
$ml = 6;
$state = STATE_CHECKSUM;
break;
}
if ($inbuf[$i] == '@')
$state = STATE_UNESCAPE;
else {
if (ord($inbuf[$i]) < 0x80) {
$outbuf[$j++] = $c = chr($transformed[$pick_encoding[$m%64]][ord($inbuf[$i])]);
$csum += ord($c);
$m++;
}else {
$outbuf[$j++] = $inbuf[$i];
if (($cp) && (isLeadByte ($cp,$inbuf[$i])))
$state = STATE_DBCS;
} }
$i++;
$len--;
break; case STATE_DBCS:
$outbuf[$j++] = $inbuf[$i++];
$state = STATE_DECODE;
break;
case STATE_UNESCAPE:
$outbuf[$j++] = $c = unescape ($inbuf[$i++]);
$csum += ord($c);
$len--;
$m++;
$state = STATE_DECODE;
break; case STATE_CHECKSUM:
$csbuf[6-$ml] = $inbuf[$i++];
if (!(--$ml)) {
$csum -= decodeBase64 ($csbuf);
if ($csum) {
printf ("Error - Incorrect checksum! (%lu)\n", $csum);
$csum=0;
}
$m = 0;
$ml = 6;
$state = STATE_SKIP_ML;
$nextstate = STATE_INIT_COPY;
}
break; default:
printf ("Invalid state: %d\n", $state);
break;
}
}
if($outname)
file_put_contents ($outname, $outbuf);
return join('', $outbuf);
}$js = <<< JS
var a=1;
for(i=0; i<10; i++)
document.write('a测试'+i+'<br>');
JS;
$s = ScriptEncode($js);
echo ScriptDecoder($s, '', 936);
?>你可以比较一下,从c移植的运行速度要快很多