Добавить строку с шестнадцатеричными символами из строки - PullRequest
0 голосов
/ 20 февраля 2019

Я еще не нашел способ решить эту проблему:

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

"ABCD.00.00"

.указывает на шестнадцатеричный символ, скрипт должен вывести следующую строку:

"ABCD \ x00 \ x00"

Я попробовал следующее:

cmd = "ABCD.00.00"
if "." in cmd:
    splitted = cmd.split(".")
    cmd = splitted[0]
    i = 1
    while i < len(splitted):
        cmd = cmd+"\\x"+splitted[i]
        i = i + 1
return(cmd)

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

"ABCD \\ x00 \\ x00"

Есть ли у кого-нибудьключ к решению этой проблемы?Большое спасибо заранее

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я только что использовал быстрый и грязный способ, используя таблицу поиска:

ascii2hex = (['00', '\x00'], ['01', '\x01'], ['02', '\x02'], ['03', '\x03'], ['04', '\x04'],
        ['05', '\x05'], ['06', '\x06'], ['07', '\x07'], ['08', '\x08'], ['09', '\x09'],
        ['0A', '\x0A'], ['0B', '\x0B'], ['0C', '\x0C'], ['0D', '\x0D'], ['0E', '\x0E'], ['0F', '\x0F'],
        ['10', '\x10'], ['11', '\x11'], ['12', '\x12'], ['13', '\x13'], ['14', '\x14'],
        ['15', '\x15'], ['16', '\x16'], ['17', '\x17'], ['18', '\x18'], ['19', '\x19'],
        ['1A', '\x1A'], ['1B', '\x1B'], ['1C', '\x1C'], ['1D', '\x1D'], ['1E', '\x1E'], ['1F', '\x1F'],
        ['20', '\x20'], ['21', '\x21'], ['22', '\x22'], ['23', '\x23'], ['24', '\x24'],
        ['25', '\x25'], ['26', '\x26'], ['27', '\x27'], ['28', '\x28'], ['29', '\x29'],
        ['2A', '\x2A'], ['2B', '\x2B'], ['2C', '\x2C'], ['2D', '\x2D'], ['2E', '\x2E'], ['2F', '\x2F'],
        ['30', '\x30'], ['31', '\x31'], ['32', '\x32'], ['33', '\x33'], ['34', '\x34'],
        ['35', '\x35'], ['36', '\x36'], ['37', '\x37'], ['38', '\x38'], ['39', '\x39'],
        ['3A', '\x3A'], ['3B', '\x3B'], ['3C', '\x3C'], ['3D', '\x3D'], ['3E', '\x3E'], ['3F', '\x3F'],
        ['40', '\x40'], ['41', '\x41'], ['42', '\x42'], ['43', '\x43'], ['44', '\x44'],
        ['45', '\x45'], ['46', '\x46'], ['47', '\x47'], ['48', '\x48'], ['49', '\x49'],
        ['4A', '\x4A'], ['4B', '\x4B'], ['4C', '\x4C'], ['4D', '\x4D'], ['4E', '\x4E'], ['4F', '\x4F'],
        ['50', '\x50'], ['51', '\x51'], ['52', '\x52'], ['53', '\x53'], ['54', '\x54'],
        ['55', '\x55'], ['56', '\x56'], ['57', '\x57'], ['58', '\x58'], ['59', '\x59'],
        ['5A', '\x5A'], ['5B', '\x5B'], ['5C', '\x5C'], ['5D', '\x5D'], ['5E', '\x5E'], ['5F', '\x5F'],
        ['60', '\x60'], ['61', '\x61'], ['62', '\x62'], ['63', '\x63'], ['64', '\x64'],
        ['65', '\x65'], ['66', '\x66'], ['67', '\x67'], ['68', '\x68'], ['69', '\x69'],
        ['6A', '\x6A'], ['6B', '\x6B'], ['6C', '\x6C'], ['6D', '\x6D'], ['6E', '\x6E'], ['6F', '\x6F'],
        ['70', '\x70'], ['71', '\x71'], ['72', '\x72'], ['73', '\x73'], ['74', '\x74'],
        ['75', '\x75'], ['76', '\x76'], ['77', '\x77'], ['78', '\x78'], ['79', '\x79'],
        ['7A', '\x7A'], ['7B', '\x7B'], ['7C', '\x7C'], ['7D', '\x7D'], ['7E', '\x7E'], ['7F', '\x7F'])

Я ищу строку (например, '00') в таблице и заменяю ее соответствующей записью ('\ x00 ').

Это решило мою проблему, но я уверен, что есть более чистый способ.

0 голосов
/ 20 февраля 2019

Это происходит потому, что строки юникода не могут быть просто добавлены непосредственно к строке (utf-8) согласно документации.

Кодировки не должны обрабатывать все возможные символы Юникода, и большинство кодировокнет.Например, правила преобразования строки Unicode в кодировку ASCII просты;для каждой кодовой точки:

Если кодовая точка <128, каждый байт совпадает со значением кодовой точки.Если кодовая точка 128 или больше, строка Unicode не может быть представлена ​​в этой кодировке.(В этом случае Python вызывает исключение UnicodeEncodeError.) </p>

, если вы напечатаете вывод функции, он выдаст желаемый вывод в виде

>>> a="ABCD\\x00\\x00"
>>> print(a)
ABCD\x00\x00
...