2016-03-10 10 views
0

У меня есть скрипт, который использует словарь для дешифрования зашифрованного сообщения, проблема в процессе дешифрования приводит к множеству ненужных символов (a.k.a non-ascii). Вот мой код:исключая символы не-ascii в python

from Crypto.Cipher import AES 
import base64 
import os 

BLOCK_SIZE = 32 

PADDING = '{' 

# Encrypted text to decrypt 
encrypted = "WI4wBGwWWNcxEovAe3p+GrpK1GRRQcwckVXypYlvdHs=" 

DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

adib = open('words.txt') 
for line in adib.readlines(): 
    secret = line.rstrip('\n') 
    if (secret[-1:] == "\n"): 
     print "Error, new line character at the end of the string. This will not match!" 
    elif (len(secret) >= 32): 
     print "Error, string too long. Must be less than 32 characters." 
    else: 
     # create a cipher object using the secret 
     cipher = AES.new(secret + (BLOCK_SIZE - len(secret) % BLOCK_SIZE) * PADDING) 

     # decode the encoded string 
     decoded = DecodeAES(cipher, encrypted) 
     print decoded+"\n" 

что я думал до сих пор является преобразование decoded строку в Ascii затем исключить не-ASCII символов, но это не сработало.

+0

Не могли бы вы точные «words.txt» Пример файла содержимого пожалуйста –

+0

Она содержит общие слова, но вот некоторые слова – shoomy

+0

' и Один Часть Эпизод Глава Пираты Arc Редактировать Объем его SLOTNAME Остров что Луффи был для с разделе World Категория Специальные Манга википедия Wiki Энциклопедия являются Японский это аниме SBS Vol страница НАЧАТЬ END Помощь Викия Синий Экипаж от пользователя Buggy Стро Портрет Гранд его Pirate Новые Шаблон Marines они не Hat Devil FLUSH TOP BOXAD навигационная панель обезьяны их Крокодил Вниз Страница Начало Шанкса имеют Shichibukai все имеет Canon Правила Викия AllPages Плодовые Зоро Бели моря имя когда Image один Usopp Battle Правительство Руководство Random' – shoomy

ответ

0

Эта версия будет работать:

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

def evaluate_string_is_ascii(mystring): 
    is_full_ascii=True 
    for c in mystring: 
     try: 
      if ord(c)>0 and ord(c)<=127: 
       #print c,"strict ascii =KEEP" 
       pass 
      elif ord(c)>127 and ord(c)<=255: 
       #print c,"extended ascii code =TRASH" 
       is_full_ascii=False 
       break 
      else: 
       # print c,"no ascii =TRASH" 
       is_full_ascii=False 
       break 
     except: 
      #print c,"no ascii =TRASH" 
      is_full_ascii=False 
      break 
    return is_full_ascii 


my_text_content="""azertwxcv 
123456789 
456dqsdq13 
[email protected]��nS��?t#� 
lkjal� 
kfldjkjl&é""" 

for line in my_text_content.split('\n'): 

    #check if line contain only ascii 
    if evaluate_string_is_ascii(line)==True: 

     #print the line 
     print line 
+0

ваш код работает очень хорошо, но я хочу, чтобы не печатать строку, которая содержит символы, отличные от ascii, поэтому, если строка 'decoded' содержит символ non-ascii, она не будет напечатана – shoomy

+0

Теперь все в порядке? Вы можете повторно использовать функцию 'valu_string_is_ascii (mystring)' в своем собственном коде следующим образом: 'if valu_string_is_ascii (декодировано) == Истина:' 'print decoded +" \ n "' –

+0

Сейчас работает, спасибо, мой друг! – shoomy

1

Вы можете удалить символы без ascii следующим образом: РЕДАКТИРОВАТЬ: сначала обновляется декодирование.

output = 'string with some non-ascii characters��@$���9�HK��F�23 some more char' 
output = output.decode('utf-8').encode('ascii', 'ignore') 
+0

Я получаю сообщение об ошибке с этим выходом 'Traceback (последний последний звонок): Файл« code.py », строка 28, в decoded = decoded.decode ('utf-8'). encode ('ascii', 'ignore') Файл «/usr/lib/python2.7/encodings/utf_8.py», строка 16, в декоде возвратные кодеки .utf_8_decode (вход, ошибки, True) UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0x96 в позиции 0: недействительный стартовый байт – shoomy

 Смежные вопросы

  • Нет связанных вопросов^_^