Advertisement
Guest User

Untitled

a guest
Feb 20th, 2014
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.50 KB | None | 0 0
  1. import random
  2. from decimal import *
  3. import pymel.core as py
  4. def conversion(originalNumber,encode,bits,password=''):
  5.    
  6.     newNumbers = str(originalNumber).split('.')
  7.     newValue = []
  8.    
  9.     for i in range(len(newNumbers)):
  10.        
  11.         value = newNumbers[i]
  12.        
  13.         if value[0] == '-':
  14.             if len(value) == 1:
  15.                 value = '-0'
  16.             newValue.append( '-'+base64(value[1:],encode,bits,password) )
  17.        
  18.         else:
  19.             if len(value) == 0:
  20.                 value = '-0'
  21.             newValue.append( base64(value,encode,bits,password) )
  22.            
  23.            
  24.     return '.'.join(newValue)
  25.    
  26. def allLetters():
  27.     charactersNum = '0123456789'
  28.     charactersUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  29.     charactersLower = 'abcdefghijklmnopqrstuvwxyz'
  30.     charactersSymbols = '|+@$%^&*?!-=+_,[]/\‰#{}()~'
  31.     characters = charactersNum + charactersUpper + charactersLower + charactersSymbols
  32.     return list(characters)
  33.        
  34. def base64(originalNumber,encode,baseNum,key=''):
  35.  
  36.     getcontext().prec = len(str(originalNumber)) * 2
  37.    
  38.     if key != '':
  39.         random.seed(key)
  40.     else:
  41.         random.seed(0)
  42.    
  43.     fullList = allLetters()
  44.     splitNumber = list(str(originalNumber))
  45.    
  46.     validCharacters = False
  47.     for i in range(len(fullList)):
  48.         for j in range(len(splitNumber)):
  49.             if fullList[i]==splitNumber[j] or fullList[i]=='.':
  50.                 validCharacters = True
  51.  
  52.     if baseNum > fullList:
  53.         baseNum = fullList
  54.     else:
  55.         del fullList[baseNum:]
  56.        
  57.     if key != '':
  58.         random.shuffle(fullList)
  59.  
  60.     if validCharacters == True:
  61.         if encode == True:
  62.            
  63.             getcontext().prec = len(str(originalNumber))
  64.            
  65.             #fix for decimal points
  66.             decimalPoint = originalNumber.find('.')
  67.             if decimalPoint != -1:
  68.                 originalNumber = Decimal(originalNumber) * pow(10, abs(Decimal(originalNumber).as_tuple().exponent))
  69.          
  70.             else:
  71.                 originalNumber = Decimal(originalNumber)
  72.          
  73.             #find number of iterations
  74.             i = originalNumber
  75.             count = 1
  76.             while i >= 0:
  77.              
  78.                 if i >= baseNum:
  79.                     i = int( Decimal(i) / Decimal(baseNum) )
  80.                     count = count + 1
  81.              
  82.                 else:
  83.                     i = -1
  84.                
  85.             coreValues = []
  86.            
  87.             #find factors
  88.             for i in range(-count,0):
  89.                
  90.                 multiple = Decimal(baseNum)**(-i-1)
  91.                
  92.                 #remove this from value to give correct factor
  93.                 if i == -count:
  94.                     removeValue = 0
  95.                 else:
  96.                     removeValue =  Decimal( Decimal( str( Decimal(originalNumber/multiplePrev) ).split( '.' )[0] ) * baseNum )
  97.                
  98.                 #calculate letter value    
  99.                 currentNumber = int( Decimal( str( Decimal(originalNumber/multiple) ).split( '.' )[0] ) - removeValue )
  100.                
  101.                 coreValues.append( currentNumber )
  102.                
  103.                 multiplePrev = multiple
  104.        
  105.             num = ''
  106.            
  107.             #assign matching letter values
  108.             if baseNum > 2:
  109.                 for i in range(len(coreValues)):
  110.                     num += str(fullList[coreValues[i]])
  111.             #fix for binary
  112.             else:
  113.                 while originalNumber > 1:
  114.                     if float( int(originalNumber/Decimal('2')) ) != float( originalNumber/Decimal('2.0') ):
  115.                         num = '1' + num
  116.                     else:
  117.                         num = '0' + num
  118.                     originalNumber /= Decimal('2')
  119.                 if originalNumber == 1 and len(num) == 0:
  120.                     num = 1
  121.            
  122.         else:
  123.             num = Decimal('0')
  124.             for i in range(len(splitNumber)):
  125.                 for j in range(len(fullList)):
  126.                     if splitNumber[i] == fullList[j]:
  127.                         amount = Decimal(str(j))*Decimal(str(baseNum))**Decimal(str(len(splitNumber)-i-1))
  128.                         if 'E+' in str(amount):
  129.                             getcontext().prec = str(amount).split('E+')[1]
  130.                             amount = Decimal(str(j))*Decimal(str(baseNum))**Decimal(str(len(splitNumber)-i-1))
  131.                         num += amount
  132.             num = str(num)    
  133.        
  134.         return num
  135.      
  136. class userInterface():
  137.    
  138.     windowName = "userInterfaceWin"
  139.    
  140.     @classmethod
  141.     def display(cls):
  142.        
  143.         try:
  144.             py.deleteUI(cls.windowName, window=True)
  145.             py.windowPref(cls.windowName, remove=True )
  146.         except:
  147.             pass
  148.        
  149.         main_window = py.window(cls.windowName, title="Encode/decode number")
  150.         win_layout = py.rowColumnLayout(numberOfColumns=4)
  151.         py.text(label='  ')  
  152.         cls.selected = py.text(label=' <font size ="2">Currently selected: Encode</font>                                                  ', align = "left")  
  153.         py.text(label='      ')  
  154.         py.text(label='      ', align = "left")  
  155.         py.text(label=' ', height = 5)  
  156.         py.text(label=' ', height = 5)  
  157.         py.text(label=' ', height = 5)  
  158.         py.text(label=' ', height = 5)
  159.         py.text(label=' ')
  160.         py.text( label = "   Encode the number                   ", align = "left" )
  161.         py.text(label='      ')  
  162.         py.text(label='Enter number  ', align = "right")  
  163.         py.text(label=' ')  
  164.         py.button( label="Encode", parent = win_layout, command = py.Callback( userInterface.calculate, True ))
  165.         cls.validation = py.text(label='0', visible = False)  
  166.         cls.encodeNum = py.textField(changeCommand = 'userInterface.calculate(True)')
  167.         py.text(label=' ')  
  168.         py.text(label=' ')  
  169.         py.text(label=' ')
  170.         py.text(label=' ')
  171.         py.text(label=' ')  
  172.         py.text( label = "   Decode the number            ", align = "left" )
  173.         py.text(label=' ')
  174.         py.text(label='Enter string  ', align = "right")
  175.         py.text(label=' ')  
  176.         py.button( label="Decode", parent = win_layout, command = py.Callback( userInterface.calculate, False ))
  177.         cls.numberStore = py.text(label='1', visible = False)
  178.         cls.decodeNum = py.textField(changeCommand = 'userInterface.calculate(False)')
  179.         py.text(label=' ')  
  180.         py.text(label=' ')  
  181.         py.text(label=' ')  
  182.         py.text(label=' ')  
  183.         py.text(label=' ')  
  184.         cls.length1 = py.text(label='   Default length:', align = "left")
  185.         py.text(label=' ')
  186.         py.text(label=' Select number of bits to use')
  187.         py.text(label=' ')  
  188.         cls.length2 = py.text(label='     New length:', align = "left")  
  189.         py.text(label=' ')  
  190.         cls.bits = py.floatSliderGrp( field = True, parent = win_layout, min = 2, max = 88, fmn = 2, fmx = 88, pre = 0, changeCommand = 'userInterface.update()')
  191.         cls.bits.setValue(16)
  192.         py.text(label=' ')  
  193.         py.text(label=' ')
  194.         py.text(label=' ')
  195.         py.text(label=' Key (optional)  ', align = "right")  
  196.         py.text(label=' ')  
  197.         cls.updateSlider = py.checkBox(label=' Auto update with slider', value = True, changeCommand = 'userInterface.update()')
  198.         py.text(label=' ')  
  199.         cls.password = py.textField(changeCommand = 'userInterface.update()')
  200.         py.showWindow(cls.windowName)
  201.        
  202.     @classmethod
  203.     def update(cls):
  204.        
  205.         if py.checkBox( cls.updateSlider, query=True, value=True ) == True:
  206.             encode = py.text( cls.numberStore, query=True, label=True)
  207.             bits = int(py.floatSliderGrp(cls.bits, q=True, value=True))
  208.             value1 = py.textField(cls.encodeNum, q=True, text=True)
  209.             value2 = py.textField(cls.decodeNum, q=True, text=True)
  210.             password = py.textField(cls.password, q=True, text=True)
  211.            
  212.             if py.text( cls.validation, query=True, label=True ) == '2':
  213.                 py.text( cls.validation, edit=True, label='1')
  214.            
  215.             if encode == '1':
  216.                 value = value1
  217.             else:
  218.                 value = value2
  219.                
  220.                
  221.                 listOfCharacters = allLetters()[:bits]
  222.                 for i in range(len(list(value))):
  223.                     if value[i] not in listOfCharacters:
  224.                         py.text( cls.length2, edit=True, label="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New length: <font color='red'>Invalid value</font>" )
  225.                         py.text( cls.validation, edit=True, label='2')
  226.                    
  227.             if py.text( cls.validation, query=True, label=True) == '1':
  228.                
  229.                 try:
  230.                        
  231.                     result = conversion(value,int(encode),bits,password)
  232.                    
  233.                     if encode == '1':
  234.                         py.text( cls.length1, edit=True, label="   Default length: " + str(len(value)) )
  235.                         py.text( cls.length2, edit=True, label="     New length: " + str(len(result)) )
  236.                         py.textField(cls.decodeNum, edit=True, text=result)
  237.                    
  238.                     else:
  239.                         py.text( cls.length1, edit=True, label="   Default length: " + str(len(result)) )
  240.                         py.text( cls.length2, edit=True, label="     New length: " + str(len(value)) )
  241.                         py.textField(cls.encodeNum, edit=True, text=result)
  242.                    
  243.                 except:
  244.                     pass
  245.                
  246.        
  247.     @classmethod
  248.     def calculate(cls, encode):
  249.        
  250.         py.text( cls.validation, edit=True, label='1')
  251.        
  252.         bits = int(py.floatSliderGrp(cls.bits, q=True, value=True))
  253.         value1 = py.textField(cls.encodeNum, q=True, text=True)
  254.         value2 = py.textField(cls.decodeNum, q=True, text=True)
  255.         password = py.textField(cls.password, q=True, text=True)
  256.        
  257.         if encode == True:
  258.            
  259.             py.text( cls.numberStore, edit=True, label=1)
  260.             py.text( cls.selected, edit=True, label=' <font size ="2">Currently selected: Encode</font>                                                  ')
  261.             value = value1
  262.            
  263.             try:
  264.                 int(value) / 2
  265.                
  266.             except:
  267.                 if encode == True:
  268.                     py.text( cls.length1, edit=True, label="&nbsp;&nbsp;&nbsp;Default length: <font color='red'>Invalid value</font>" )
  269.                     py.text( cls.validation, edit=True, label='0')
  270.                    
  271.         else:
  272.            
  273.             py.text( cls.numberStore, edit=True, label=0)
  274.             py.text( cls.selected, edit=True, label=' <font size ="2">Currently selected: Decode</font>                                                  ')
  275.             value = str(value2)
  276.  
  277.             if len(value) == 0:
  278.                 py.text( cls.length2, edit=True, label="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New length: <font color='red'>Invalid value</font>" )
  279.                 py.text( cls.validation, edit=True, label='0')
  280.                
  281.            
  282.             listOfCharacters = allLetters()[:bits]
  283.             for i in range(len(list(value))):
  284.                 if value[i] not in listOfCharacters:
  285.                     py.text( cls.length2, edit=True, label="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New length: <font color='red'>Invalid value</font>" )
  286.                     py.text( cls.validation, edit=True, label='0')
  287.                          
  288.         if py.text( cls.validation, query=True, label=True) == '1':
  289.            
  290.             result = conversion(value,encode,bits,password)
  291.            
  292.             if encode == True:
  293.                 py.text( cls.length1, edit=True, label="   Default length: " + str(len(value)) )
  294.                 py.text( cls.length2, edit=True, label="     New length: " + str(len(result)) )
  295.                 py.textField(cls.decodeNum, edit=True, text=result)
  296.            
  297.             else:
  298.                
  299.                 py.text( cls.length1, edit=True, label="   Default length: " + str(len(result)) )
  300.                 py.text( cls.length2, edit=True, label="     New length: " + str(len(value)) )
  301.                 py.textField(cls.encodeNum, edit=True, text=result)
  302.            
  303.        
  304.  
  305. userInterface.display()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement