Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- from decimal import *
- import pymel.core as py
- def conversion(originalNumber,encode,bits,password=''):
- newNumbers = str(originalNumber).split('.')
- newValue = []
- for i in range(len(newNumbers)):
- value = newNumbers[i]
- if value[0] == '-':
- if len(value) == 1:
- value = '-0'
- newValue.append( '-'+base64(value[1:],encode,bits,password) )
- else:
- if len(value) == 0:
- value = '-0'
- newValue.append( base64(value,encode,bits,password) )
- return '.'.join(newValue)
- def allLetters():
- charactersNum = '0123456789'
- charactersUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- charactersLower = 'abcdefghijklmnopqrstuvwxyz'
- charactersSymbols = '|+@$%^&*?!-=+_,[]/\‰#{}()~'
- characters = charactersNum + charactersUpper + charactersLower + charactersSymbols
- return list(characters)
- def base64(originalNumber,encode,baseNum,key=''):
- getcontext().prec = len(str(originalNumber)) * 2
- if key != '':
- random.seed(key)
- else:
- random.seed(0)
- fullList = allLetters()
- splitNumber = list(str(originalNumber))
- validCharacters = False
- for i in range(len(fullList)):
- for j in range(len(splitNumber)):
- if fullList[i]==splitNumber[j] or fullList[i]=='.':
- validCharacters = True
- if baseNum > fullList:
- baseNum = fullList
- else:
- del fullList[baseNum:]
- if key != '':
- random.shuffle(fullList)
- if validCharacters == True:
- if encode == True:
- getcontext().prec = len(str(originalNumber))
- #fix for decimal points
- decimalPoint = originalNumber.find('.')
- if decimalPoint != -1:
- originalNumber = Decimal(originalNumber) * pow(10, abs(Decimal(originalNumber).as_tuple().exponent))
- else:
- originalNumber = Decimal(originalNumber)
- #find number of iterations
- i = originalNumber
- count = 1
- while i >= 0:
- if i >= baseNum:
- i = int( Decimal(i) / Decimal(baseNum) )
- count = count + 1
- else:
- i = -1
- coreValues = []
- #find factors
- for i in range(-count,0):
- multiple = Decimal(baseNum)**(-i-1)
- #remove this from value to give correct factor
- if i == -count:
- removeValue = 0
- else:
- removeValue = Decimal( Decimal( str( Decimal(originalNumber/multiplePrev) ).split( '.' )[0] ) * baseNum )
- #calculate letter value
- currentNumber = int( Decimal( str( Decimal(originalNumber/multiple) ).split( '.' )[0] ) - removeValue )
- coreValues.append( currentNumber )
- multiplePrev = multiple
- num = ''
- #assign matching letter values
- if baseNum > 2:
- for i in range(len(coreValues)):
- num += str(fullList[coreValues[i]])
- #fix for binary
- else:
- while originalNumber > 1:
- if float( int(originalNumber/Decimal('2')) ) != float( originalNumber/Decimal('2.0') ):
- num = '1' + num
- else:
- num = '0' + num
- originalNumber /= Decimal('2')
- if originalNumber == 1 and len(num) == 0:
- num = 1
- else:
- num = Decimal('0')
- for i in range(len(splitNumber)):
- for j in range(len(fullList)):
- if splitNumber[i] == fullList[j]:
- amount = Decimal(str(j))*Decimal(str(baseNum))**Decimal(str(len(splitNumber)-i-1))
- if 'E+' in str(amount):
- getcontext().prec = str(amount).split('E+')[1]
- amount = Decimal(str(j))*Decimal(str(baseNum))**Decimal(str(len(splitNumber)-i-1))
- num += amount
- num = str(num)
- return num
- class userInterface():
- windowName = "userInterfaceWin"
- @classmethod
- def display(cls):
- try:
- py.deleteUI(cls.windowName, window=True)
- py.windowPref(cls.windowName, remove=True )
- except:
- pass
- main_window = py.window(cls.windowName, title="Encode/decode number")
- win_layout = py.rowColumnLayout(numberOfColumns=4)
- py.text(label=' ')
- cls.selected = py.text(label=' <font size ="2">Currently selected: Encode</font> ', align = "left")
- py.text(label=' ')
- py.text(label=' ', align = "left")
- py.text(label=' ', height = 5)
- py.text(label=' ', height = 5)
- py.text(label=' ', height = 5)
- py.text(label=' ', height = 5)
- py.text(label=' ')
- py.text( label = " Encode the number ", align = "left" )
- py.text(label=' ')
- py.text(label='Enter number ', align = "right")
- py.text(label=' ')
- py.button( label="Encode", parent = win_layout, command = py.Callback( userInterface.calculate, True ))
- cls.validation = py.text(label='0', visible = False)
- cls.encodeNum = py.textField(changeCommand = 'userInterface.calculate(True)')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text( label = " Decode the number ", align = "left" )
- py.text(label=' ')
- py.text(label='Enter string ', align = "right")
- py.text(label=' ')
- py.button( label="Decode", parent = win_layout, command = py.Callback( userInterface.calculate, False ))
- cls.numberStore = py.text(label='1', visible = False)
- cls.decodeNum = py.textField(changeCommand = 'userInterface.calculate(False)')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- cls.length1 = py.text(label=' Default length:', align = "left")
- py.text(label=' ')
- py.text(label=' Select number of bits to use')
- py.text(label=' ')
- cls.length2 = py.text(label=' New length:', align = "left")
- py.text(label=' ')
- cls.bits = py.floatSliderGrp( field = True, parent = win_layout, min = 2, max = 88, fmn = 2, fmx = 88, pre = 0, changeCommand = 'userInterface.update()')
- cls.bits.setValue(16)
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' ')
- py.text(label=' Key (optional) ', align = "right")
- py.text(label=' ')
- cls.updateSlider = py.checkBox(label=' Auto update with slider', value = True, changeCommand = 'userInterface.update()')
- py.text(label=' ')
- cls.password = py.textField(changeCommand = 'userInterface.update()')
- py.showWindow(cls.windowName)
- @classmethod
- def update(cls):
- if py.checkBox( cls.updateSlider, query=True, value=True ) == True:
- encode = py.text( cls.numberStore, query=True, label=True)
- bits = int(py.floatSliderGrp(cls.bits, q=True, value=True))
- value1 = py.textField(cls.encodeNum, q=True, text=True)
- value2 = py.textField(cls.decodeNum, q=True, text=True)
- password = py.textField(cls.password, q=True, text=True)
- if py.text( cls.validation, query=True, label=True ) == '2':
- py.text( cls.validation, edit=True, label='1')
- if encode == '1':
- value = value1
- else:
- value = value2
- listOfCharacters = allLetters()[:bits]
- for i in range(len(list(value))):
- if value[i] not in listOfCharacters:
- py.text( cls.length2, edit=True, label=" New length: <font color='red'>Invalid value</font>" )
- py.text( cls.validation, edit=True, label='2')
- if py.text( cls.validation, query=True, label=True) == '1':
- try:
- result = conversion(value,int(encode),bits,password)
- if encode == '1':
- py.text( cls.length1, edit=True, label=" Default length: " + str(len(value)) )
- py.text( cls.length2, edit=True, label=" New length: " + str(len(result)) )
- py.textField(cls.decodeNum, edit=True, text=result)
- else:
- py.text( cls.length1, edit=True, label=" Default length: " + str(len(result)) )
- py.text( cls.length2, edit=True, label=" New length: " + str(len(value)) )
- py.textField(cls.encodeNum, edit=True, text=result)
- except:
- pass
- @classmethod
- def calculate(cls, encode):
- py.text( cls.validation, edit=True, label='1')
- bits = int(py.floatSliderGrp(cls.bits, q=True, value=True))
- value1 = py.textField(cls.encodeNum, q=True, text=True)
- value2 = py.textField(cls.decodeNum, q=True, text=True)
- password = py.textField(cls.password, q=True, text=True)
- if encode == True:
- py.text( cls.numberStore, edit=True, label=1)
- py.text( cls.selected, edit=True, label=' <font size ="2">Currently selected: Encode</font> ')
- value = value1
- try:
- int(value) / 2
- except:
- if encode == True:
- py.text( cls.length1, edit=True, label=" Default length: <font color='red'>Invalid value</font>" )
- py.text( cls.validation, edit=True, label='0')
- else:
- py.text( cls.numberStore, edit=True, label=0)
- py.text( cls.selected, edit=True, label=' <font size ="2">Currently selected: Decode</font> ')
- value = str(value2)
- if len(value) == 0:
- py.text( cls.length2, edit=True, label=" New length: <font color='red'>Invalid value</font>" )
- py.text( cls.validation, edit=True, label='0')
- listOfCharacters = allLetters()[:bits]
- for i in range(len(list(value))):
- if value[i] not in listOfCharacters:
- py.text( cls.length2, edit=True, label=" New length: <font color='red'>Invalid value</font>" )
- py.text( cls.validation, edit=True, label='0')
- if py.text( cls.validation, query=True, label=True) == '1':
- result = conversion(value,encode,bits,password)
- if encode == True:
- py.text( cls.length1, edit=True, label=" Default length: " + str(len(value)) )
- py.text( cls.length2, edit=True, label=" New length: " + str(len(result)) )
- py.textField(cls.decodeNum, edit=True, text=result)
- else:
- py.text( cls.length1, edit=True, label=" Default length: " + str(len(result)) )
- py.text( cls.length2, edit=True, label=" New length: " + str(len(value)) )
- py.textField(cls.encodeNum, edit=True, text=result)
- userInterface.display()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement