| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package  | 
| #  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2018-7-18 ÉÏÎç11:22:43  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
|   | 
| import struct  | 
| import string  | 
| import datetime  | 
| import os  | 
| import binascii  | 
| import socket  | 
| import sys  | 
|   | 
|   | 
| #pythonµÄ¶ÁÈ¡/дÈë¿â  | 
| #Òª½øÐз´×ª¸ßµÍλµÄ»°£¬¿ÉʹÓÃ!·ûºÅ£¬Èçstruct.unpack_from('!B', buf, pos)  | 
|   | 
| #------------------------¶ÁÈ¡   | 
| def ReadBYTE(buf, pos):  | 
|     curValue = struct.unpack_from('b', buf, pos)  | 
|     pos += 1  | 
|     return curValue[0], pos  | 
|   | 
| def ReadWORD(buf, pos):  | 
|     curValue = struct.unpack_from('H', buf, pos)  | 
|     pos += 2    | 
|     return curValue[0], pos  | 
|   | 
| def ReadDWORD(buf, pos):  | 
|     curValue = struct.unpack_from('i', buf, pos)    | 
|     pos += 4  | 
|     return curValue[0], pos  | 
|   | 
| def ReadFloat(buf, pos):  | 
|     curValue = struct.unpack_from('f', buf, pos)    | 
|     pos += 4  | 
|     return curValue[0], pos  | 
|   | 
| def ReadDouble(buf, pos):  | 
|     curValue = struct.unpack_from('d', buf, pos)    | 
|     pos += 8  | 
|     return curValue[0], pos  | 
|   | 
| def ReadString(buf, pos, _len):  | 
|     curValue = struct.unpack_from('%ds'%_len, buf, pos)  | 
|     pos += _len    | 
|     return curValue[0], pos  | 
|   | 
|   | 
| #----------------------дÈë  | 
| def WriteBYTE(buf, value):  | 
|     buf += struct.pack('b', value)  | 
|     return buf  | 
|   | 
| def WriteWORD(buf, value):  | 
|     buf += struct.pack('H', value)  | 
|     return buf  | 
|   | 
| def WriteDWORD(buf, value):  | 
|     buf += struct.pack('i', value)  | 
|     return buf  | 
|   | 
| def WriteFloat(buf, value):  | 
|     buf += struct.pack('f', value)  | 
|     return buf  | 
|   | 
| def WriteDouble(buf, value):  | 
|     buf += struct.pack('d', value)  | 
|     return buf  | 
|   | 
| def WriteString(buf, len, value):  | 
|     buf += struct.pack('%ds'%len, value)  | 
|     return buf  | 
|   | 
|   | 
|   | 
| #»ñµÃµ±Ç°ÏµÍ³Ê±¼ä  | 
| def GetCurrentDataTimeStr():  | 
|     curTime = datetime.datetime.today()  | 
|     curTimeStr = str(curTime)  | 
|     curTimeStr = curTimeStr.split(".")[0]  | 
|     return curTimeStr  | 
|   | 
| #»ñµÃϵͳʱ¼ä(²ÎÊý -> Ê±¼äÁбí)  | 
| def GetDateTimeByStr(timeStr):  | 
|     timeStr = timeStr.split(".")[0]  | 
|     return  datetime.datetime.strptime(timeStr, "%Y-%m-%d %H:%M:%S")  | 
|       | 
|       | 
|       | 
| #×Ö·û´®×ª»»ÎªÕûÐÍ, Èç¹û²»ÄÜת»», ·µ»ØÄ¬ÈÏÖµ  | 
| def ToIntDef(input, defValue = 0):  | 
|     try:  | 
|         result = int(input)  | 
|         return result  | 
|     except ValueError:  | 
|         return defValue  | 
|       | 
|       | 
| #×Ö·û´®×ª»»ÎªÕûÐÍ, Èç¹û²»ÄÜת»», ·µ»ØFalse,ÔÖµ  | 
| def StrToInt(input):  | 
|     try:  | 
|         result = int(input)  | 
|         return True,result  | 
|     except ValueError:  | 
|         return False,input  | 
|       | 
|       | 
| #16½øÖÆÑÕɫת»»  | 
| #"#FFFFFF"--"255,255,255"  | 
| def HcToSc(h):  | 
|     h="0x"+h[1:7]  | 
|     red=string.atoi(h[:2]+h[2:4], base=16)  | 
|     green=string.atoi(h[:2]+h[4:6], base=16)  | 
|     blue=string.atoi(h[:2]+h[6:8], base=16)  | 
|     cStr=str(red)+","+str(green)+","+str(blue)  | 
|     return cStr  | 
|   | 
| #"255,255,255"--"#FFFFFF"  | 
| def ScToHc(s):  | 
|     red=hex(string.atoi(s.split(",")[0]))[2:]  | 
|     green=hex(string.atoi(s.split(",")[1]))[2:]  | 
|     blue=hex(string.atoi(s.split(",")[2]))[2:]  | 
|     hStr="#"+str(red+green+blue)  | 
|     return hStr  | 
|   | 
| #16½øÖÆ×ª»»  | 
| #"0xFFFFFF"--"255,255,255"  | 
| def HdToSd(h):  | 
|     red=string.atoi(h[0:2]+h[2:4], base=16)  | 
|     green=string.atoi(h[0:2]+h[4:6], base=16)  | 
|     blue=string.atoi(h[0:2]+h[6:8], base=16)  | 
|     cStr=str(red)+","+str(green)+","+str(blue)  | 
|     return cStr  | 
|   | 
| #"255,255,255"--"0xFFFFFF"  | 
| def SdToHd(s):  | 
|     red=hex(string.atoi(s.split(",")[0]))[2:]  | 
|     green=hex(string.atoi(s.split(",")[1]))[2:]  | 
|     blue=hex(string.atoi(s.split(",")[2]))[2:]  | 
|     hStr="0x"+str(red+green+blue)  | 
|     return hStr  | 
|   | 
| def GetPercent(value1, value2):  | 
|     if value2 == 0:  | 
|         return 0  | 
|     return int(float(value1) / float(value2) * 100)  | 
|   | 
|   | 
|   | 
| def OpenFileForWrite(fileName):  | 
|     dirName = os.path.dirname(fileName)  | 
|     if not os.path.isdir(dirName):  | 
|         os.makedirs(dirName)  | 
|       | 
|     if os.path.isfile(fileName):  | 
|         return open(fileName, 'w')  | 
|     return  open(fileName, 'a')  | 
|   | 
|   | 
|   | 
|   | 
| #º¯Êýµ÷Óà  | 
| def ParseNameGetObj(curCallObj, callName):  | 
|     callList = callName.split(".")  | 
|     if len(callList) <= 1:  | 
|         return None  | 
|       | 
|     for curCallName in callList:  | 
|         if hasattr(curCallObj, curCallName) != True:  | 
|             #ÎÞ´ËÊôÐÔ  | 
|             return None  | 
|         curCallObj = getattr(curCallObj, curCallName)  | 
|     return curCallObj  | 
|   | 
| #»ñµÃÖ´Ðк¯Êý  | 
| def GetExecFunc(curCallObj, callName):  | 
|     curCallObj = ParseNameGetObj(curCallObj, callName)  | 
|     if curCallObj == None:  | 
|         return None  | 
|           | 
|     if callable(curCallObj) != True:  | 
|         #²»¿Éµ÷Óà  | 
|         return None  | 
|       | 
|     return curCallObj  | 
|   | 
| #×Ö·û´®Òì»ò´¦Àí  | 
| def str_xor(astring, xornum=150):  | 
|     a=[]  | 
|     for x in astring:  | 
|         a.append(chr(ord(x)^xornum))  | 
|     return ''.join(a)  | 
|   | 
| #½âÎö·â°ü  | 
| def ParseBuff(buff):  | 
|     result=''  | 
|     for i in  range(len(buff)):  | 
|         if i%2==0 and i!=0:  | 
|             result=result + ' ' + buff[i]  | 
|         else:      | 
|             result = result + buff[i]          | 
|     return result  | 
|   | 
| def b2a_hex(data):  | 
|     return ParseBuff(binascii.b2a_hex(data))  | 
|   | 
| def GetHostName():  | 
|     return socket.gethostname()  | 
|   | 
| def GetHostIP():  | 
|     return socket.gethostbyname(GetHostName())   | 
|   | 
|   | 
| def compact_traceback():  | 
|     t, v, tb = sys.exc_info()  | 
|     tbinfo = []  | 
|     if not tb: # Must have a traceback  | 
|         raise AssertionError("traceback does not exist")  | 
|     while tb:  | 
|         tbinfo.append((  | 
|             tb.tb_frame.f_code.co_filename,  | 
|             tb.tb_frame.f_code.co_name,  | 
|             str(tb.tb_lineno)  | 
|             ))  | 
|         tb = tb.tb_next  | 
|   | 
|     # just to be safe  | 
|     del tb  | 
|   | 
|     info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo])  | 
|     return t, v, info  | 
|   | 
| import base64  | 
| import urllib  | 
| import urllib2  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## ¼ÓÃÜËã·¨ÐèÒªµÄ¶¨Òå  | 
| Def_NumEncodeCnt = 3  # ¼ÓÃܵĴÎÊý  | 
| Def_NumXorKey = 151  # Òì»òµÄkey  | 
|   | 
| ## ¹«Ë¾ÄÚ²¿½âÃÜËã·¨  | 
| def GetDecodePwd(strPwd):  | 
|     strResult = strPwd  | 
|     for index in xrange(Def_NumEncodeCnt):  | 
|         strResult = base64.b64decode(strResult)  | 
|   | 
|     tempResult = ""  | 
|     for index in xrange(len(strResult)):  | 
|         tempResult += chr(ord(strResult[index])^Def_NumXorKey)  | 
|   | 
|     return tempResult  | 
|   | 
|   | 
| ## ¹«Ë¾ÄÚ²¿¼ÓÃÜËã·¨  | 
| def GetEncodePwd(strPwd):  | 
|     strResult = ""  | 
|     for index in xrange(len(strPwd)):  | 
|         strResult += chr(ord(strPwd[index])^Def_NumXorKey)  | 
|   | 
|     for index in xrange(Def_NumEncodeCnt):  | 
|         strResult = base64.b64encode(strResult)  | 
|   | 
|     return strResult  | 
|   | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ## UTF-8 <==> GBK  | 
| def gbk2utf8(content):  | 
|     if type( content ) is not str:  | 
|         content = str(content)  | 
|   | 
|     try:  | 
|         return content.decode('gbk').encode('utf-8')  | 
|     except:  | 
|         return content  | 
|   | 
|   | 
| def utf82gbk(content):  | 
|     if type( content ) is not str:  | 
|         content = str(content)  | 
|   | 
|     try:  | 
|         return content.decode('utf-8').encode('gbk')  | 
|     except:  | 
|         return content  | 
|   | 
|   | 
| ## GETÇëÇó  | 
| def DoGet(url, data=None, headers={}):   | 
|     if data:     | 
|         request = urllib2.Request(url + "?" + urllib.urlencode(data), None, headers)  | 
|     else:  | 
|         request = urllib2.Request(url, None, headers)  | 
|     response = urllib2.urlopen(request, timeout=5)  | 
|     content = response.read()  | 
|     response.close()  | 
|     return content  | 
|   | 
|   | 
| ## POSTÇëÇó  | 
| def DoPost(url, data, headers={}):  | 
|     try:  | 
|         data = urllib.urlencode(data)  | 
|     except:  | 
|         pass  | 
|       | 
|     request = urllib2.Request(url, data, headers)  | 
|     try:  | 
|         response = urllib2.urlopen(request, timeout=30)  | 
|         content = response.read()  | 
|         response.close()  | 
|     except:  | 
|         content = "error timeout"  | 
|     return content  | 
|   | 
|   | 
| FileTypeDict = {  | 
| '.txt':'text/html',  | 
| '.html':'text/html',  | 
| '.htm':'text/html',  | 
| '.bmp':'application/x-bmp',  | 
| '.ico':'image/x-icon',  | 
| '.jpe':'image/jpeg',  | 
| '.jpeg':'image/jpeg',  | 
| '.jpg':'application/x-jpg',  | 
| '.png':'application/x-png',  | 
| '.gif':'image/gif',  | 
| '.bin':'application/octet-stream',  | 
| '.*':'application/octet-stream'  | 
| }  | 
|   | 
| def GetHttpContentType(strType):  | 
|     return FileTypeDict[strType]  | 
|   | 
|   | 
|   | 
| ## ±àÂë  | 
| #  @param srcEncoding ±àÂë¸ñʽ  | 
| #  @param input ×Ö·û´®  | 
| #  @return None  | 
| def EncodingToUnicode(srcEncoding, msg):  | 
|     try:  | 
|         result = unicode(msg, srcEncoding)    #translate to utf-8  | 
|     except:  | 
|         return "EncodingToUnicode error"  | 
|     return result  | 
|   | 
|   | 
| ## ±àÂë  | 
| #  @param srcEncoding ±àÂë¸ñʽ  | 
| #  @param input ×Ö·û´®  | 
| #  @return None  | 
| def UnicodeToEncoding(dstEncoding, msg):  | 
|     try:  | 
|         result = msg.encode(dstEncoding)  | 
|     except:  | 
|         return "UnicodeToEncoding error"  | 
|     return result  |