#!/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  
 |