2015-02-09 4 views
-1

Моя задача - создать коэффициент смещения, который основан на восьмисимвольном ключе, который вычисляется ранее в программе. во-первых, каждый из символов в восьмисимвольном ключе необходимо преобразовать в эквивалентные числа ascii, затем добавить вместе, а затем делить этот результат на 8, а затем округлить до целого числа. наконец, 32 следует вычесть из этого значения.Как извлечь значения из строки? Python

это мой код до смещения фактора:

def EncryptCode(): 
    userFileLoad = input("Name the file and directory you want to load with the ending '.txt':\n") 
    with open (userFileLoad,mode="r",encoding="utf=8") as encrypt_file: 
     encrypt = encrypt_file.read() 
    print ("Code that will be encrypted:") 
    printMessage(encrypt) 
    eightNumKey = (chr(random.randint(33,126)) for _ in range(8)) 
    print('\nEight-Character Key:', "".join(eightNumKey)) 

Это, как я пытался реализовать смещение фактора в программе:

def EncryptCode(): 
    userFileLoad = input("Name the file and directory you want to load with the ending '.txt':\n") 
    with open (userFileLoad,mode="r",encoding="utf=8") as encrypt_file: 
     encrypt = encrypt_file.read() 
    print ("Code that will be encrypted:") 
    printMessage(encrypt) 
    offsetFactor = 0 
    eightNumKey = (chr(random.randint(33,126)) for _ in range(8)) 
    print('\nEight-Character Key:', "".join(eightNumKey)) 
    offsetFactor = offsetFactor + ord(eightNumKey) #I need help with this bit 
    offsetFactor = offsetFactor/8 
    offsetFactor = math.floor(offsetFactor) 
    offsetFactor = offsetFactor - 32 
    text = encrypt.split() 
    print("The offset Factor is:",offsetFactor) 

это то, что мой выход показывает:

This program has three choices. 

1. Encrypt a message. 

2. Decrypt the message. 

3. Exit the program. 


Make your choice: 1 
Name the file and directory you want to load with the ending '.txt': 
Sample.txt 
Code that will be encrypted: 


Somewhere in la Mancha, in a place whose name I do not care to remember, a gentleman lived not long ago, one of those who has a lance and ancient shield on a shelf and keeps a skinny nag and a greyhound for racing. 

Eight-Character Key: txJ#K_P` 
Traceback (most recent call last): 
    File "N:\Computer Science\Course Work\Controlled assessment\Controlled Assessment.py", line 54, in <module> 
showMenu() 
    File "N:\Computer Science\Course Work\Controlled assessment\Controlled Assessment.py", line 38, in showMenu 
    EncryptCode() 
    File "N:\Computer Science\Course Work\Controlled assessment\Controlled Assessment.py", line 26, in EncryptCode 
    offsetFactor = offsetFactor + ord(eightNumKey) 
TypeError: ord() expected string of length 1, but generator found 
+1

Это не ясно, что вы хотите сделать.eightNumKey - это последовательность символов, которую вы, очевидно, знаете, потому что раньше вы использовали 'join'. Что вы ожидаете от 'ord()', чтобы сделать с этой последовательностью? Кроме того, я не понимаю, почему вы создаете последовательность, вызывая 'chr()' на int, а затем сразу же хотите называть 'ord()' на ней. –

+0

Возможный дубликат [Извлечение значений из строки] (http://stackoverflow.com/questions/2093812/extracting-values-from-a-string) –

ответ

0

@JaimeCockburn имеет ответ на ваш вопрос. Я хотел показать, как вы можете реорганизовать свой код с помощью xrange и random.sample и избегать преобразования чисел в строки, а затем обратно в номера.

>>> 
>>> ints = xrange(33, 127) 
>>> key = random.sample(ints, 8) 
>>> key 
[78, 75, 77, 73, 94, 60, 44, 67] 
>>> offset = sum(key) 
>>> offset 
568 
>>> key = ''.join(map(chr, key)) 
>>> key 
'NKMI^<,C' 

ints можно использовать повторно.

>>> 
>>> key = random.sample(ints, 8) 
>>> key 
[90, 114, 93, 112, 40, 43, 95, 79] 
>>> offset = sum(key) 
>>> offset 
666 
>>> key = ''.join(map(chr, key)) 
>>> key 
'Zr]p(+_O' 
>>> 
1

В этой строке:

eightNumKey = (chr(random.randint(33,126)) for _ in range(8)) 

Синтаксис (a for x in y) создает генератор. Генератор - это то, что можно повторить, но создает каждый элемент итерации по мере ее появления. Фактические элементы не создаются в этой точке, но в момент их доступа.

Вы тогда перебирать все элементы генератора при печати их:

print('\nEight-Character Key:', "".join(eightNumKey)) 

После этой линии, генератор пуст, и вы никогда не можете получить детали обратно.

Наконец, вы пытаетесь получить порядковое значение этого генератора, который не имеет никакого смысла:

offsetFactor = offsetFactor + ord(eightNumKey) # eightNumKey is a generator 

Решение

Вы действительно хотите что-то больше, как это :

# Create a list, not a generator 
eightNumKey = [chr(random.randint(33, 126)) for _ in range(8)] 
# Iterate the list to print them out 
print('\nEight-Character Key:', "".join(eightNumKey)) 
# Iterate the list again to sum the ordinal values 
offsetFactor = sum(ord(c) for c in eightNumKey) 
... 

Update: Как отмечает комментатор, вы фактически делаете ord(chr(random_number)), что несколько излишним, так как конечный результат просто random_number снова. Вы можете просто сохранить целочисленные значения в списке и преобразовать их в символы, когда вы распечатываете их, сохраняя их преобразование назад и вперед.

+0

Возможно, вы захотите продемонстрировать, что '' 'ord (chr (n)) '' 'равно' '' n'''. – wwii

+0

большое вам спасибо :) –

0

Хотите попробовать это:

offset_factor = 0 
    for i in range(0, 8): 
     offset_factor = offset_factor + ord(key[i]) 
    offset_factor = offset_factor // 8 - 32 
Смежные вопросы