2015-03-25 4 views
0

Я пытался создать файл заголовка, который используется для преобразования слов в разные числовые типы (или около того) и от таких числовых типов к словам. Например, слово «привет» на числовой введите шестнадцатеричный.python: слова в восьмеричных и ascii

Я завершил работу с шестнадцатеричным и двоичным. Мне также удалось создать строку для конвертера ascii.

Это мой код:

def string_hex(string): 
    return ':'.join(format(ord(c), 'x') for c in string) 

def hex_string(hexa): 
    hexgen = (hexa[i:i+2] for i in range(0, len(hexa), 2)) 
    return ''.join(chr(eval('0x'+n)) for n in hexgen) 

def string_bin(string): 
    return ':'.join(format(ord(c), 'b') for c in string) 

def bin_string(binary): 
    bingen = (binary[i:i+7] for i in range(0, len(binary), 7)) 
    return ''.join(chr(eval('0b'+n)) for n in bingen) 

def string_ascii(string): 
    return ':'.join(str(ord(c)) for c in string) 

Ну я старался как мог, чтобы преобразовать файл ASCII в строку с помощью функции chr(). Я сделал это так:

>>> from my_convert import * 
>>> string_ascii('hello') 
>>> '104:101:108:108:111' 
>>> a = 104101108108111 
>>> chr(a) 
Traceback (most recent call last): 
    File "<pyshell#12>", line 1, in <module> 
    chr(a) 
OverflowError: Python int too large to convert to C long 

Чтобы использовать for loop и join штуковина я не знал точно, сколько чисел было бы (я мог видеть, что есть 2 значные номера и 3 цифры номера). Поэтому я был очень смущен.

Но он не работает. И также я не имею никакой идеи преобразовать такие строки в восьмеричные или из восьмеричных в строки. Мне нужно сделать конвертер 'ascii to string', 'string to actal 'конвертер и конвертер «восьмеричный в строку». Любая помощь будет оценена.

+0

_ «Я старался изо всех сил, чтобы преобразовать файл ascii в строку с помощью функции chr(). Но он не работает». Давайте посмотрим на этот код. – Kevin

+0

@Kevin Это было все, что я мог сделать в интерпретаторе сам. Я пробовал заниматься серфингом в Интернете. Но ответы, которые я нашел, даже не были близки к тому, что я имел в виду. –

+0

'import binascii; binascii.hexlify()' – Kevin

ответ

1
--> string_hex('Hello') 
'48:65:6c:6c:6f' 

--> hex_string(string_hex('Hello')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in hex_string 
    File "<stdin>", line 3, in <genexpr> 
    File "<string>", line 1 
    0x:6 
    ^
SyntaxError: invalid token 

Эти функции должны быть зеркала друг от друга - вы должны быть в состоянии hex_stringhex_string и получить то, что вы начали с.

Проблема заключается в том, что функции вашего зеркала (hex_string, bin_string, ascii_string и т. Д.) Не принимают тот же формат, что и исходные функции; Иными словами, string_hex('Hello') производит '48:65:6c:6c:6f', но hex_string требует: '48656c6c6f' для работы.

Исправьте *_string функций для работы над «словами», разделенных :, и вы найдете трудность размера слов переменных в функции ascii_string исчезают.

+0

Возможно, вы правы. Я добавил ':', потому что я хотел знать, какое значение представляет какую букву. Но я не понимаю. Предположим, что я вынул это: путем изменения '': '. join' to '.' .join'.Still, как я могу заметить, что это' [i: i + 2] 'или это' [i: i + 3] '. Тот же проблема с 'for loop'. –

+0

@ theunixdisaster: Двоеточие - хорошая идея. Помимо упрощения анализа, это также облегчает чтение. Что вам нужно сделать, так это разбить входящую строку ('hexa' или' binary' или что-то еще) на ':', а затем действовать на отдельные части - что-то вроде 'for word in hexa.split (':') ' –

+0

Я попробую. Если мне удастся, я отправлю его по моему вопросу с заголовком EDIT. Спасибо большое. –

1

Ребята, я думаю, у меня есть ответ на этот вопрос. Этот работает, даже если между числовыми значениями есть «:».

# string to hexadecimal converter 

def string_hex(string): 
    return ':'.join(format(ord(c), 'x') for c in string) 

# hexadecimal to string converter. 

def hex_string(hexa): 
    if ':' in hexa: 
     a = hexa.split(':') 
     hexa = ''.join(a) 
    hexgen = (hexa[i:i+2] for i in range(0, len(hexa), 2)) 
    return ''.join(chr(eval('0x'+n)) for n in hexgen) 

# string to binary converter 

def string_bin(string): 
    return ':'.join(format(ord(c), 'b') for c in string) 

# binary to string converter 

def bin_string(binary): 
    if ':' in binary: 
     a = binary.split(':') 
     binary = ''.join(a) 
    bingen = (binary[i:i+7] for i in range(0, len(binary), 7)) 
    return ''.join(chr(eval('0b'+n)) for n in bingen) 

# string to ascii converter 

def string_ascii(string): 
    return ':'.join(str(ord(c)) for c in string) 

# ascii to string converter 

def ascii_string(asciii): 
    if ':' in asciii: 
     b = asciii.split(':') 
     asciii = ''.join(b) 
    b = '' 
    c = '' 
    i = 0 
    while i < len(asciii): 
     b += asciii[i] 
     if chr(int(b)).isalpha(): 
      c+=chr(int(b)) 
      b = '' 
      i+=1 
     else: 
      i+=1 
    return c 

# string to octal converter 

def string_oct(string): 
    return ':'.join(format(ord(c), 'o') for c in string) 

# octal to string converter 

def oct_string(octa): 
    if ':' in octa: 
     a = octa.split(':') 
     octa = ''.join(a) 
    octgen = (octa[i:i+3] for i in range(0, len(octa), 3)) 
    return ''.join(chr(eval('0o'+n)) for n in octgen) 
+0

@ Ethan Furman У меня есть ответ здесь, и это работает отлично. Спасибо за вашу помощь. – theunixdisaster

+0

@Kevin Я сделал это окончательно. Спасибо за помощь. – theunixdisaster