Завершение задачи из строки в байты с двойной косой чертой - PullRequest
0 голосов
/ 23 марта 2020

Я не знаю, как это решить. Например, если я даю аргумент к своему коду \xFF\xFF\xFF\x0E\xFF\xFF

, когда я делаю value.encode(), он возвращает \\xFF\\xFF\\xFF\\x0E\\xFF\\xFF в bytes, что отличается от того, что я хочу.

МОЙ КОД:

import crc8
import sys

value = sys.argv[1]
hash = crc8.crc8()

hash.update(value.encode())
print(hash.hexdigest())

ЧТО МНЕ НУЖНО:

import crc8
import sys


hash = crc8.crc8()

hash.update(b'\xFF\xFF\xFF\x0E\xFF\xFF')
print(hash.hexdigest())

1 Ответ

1 голос
/ 23 марта 2020

Когда вы звоните value.encode(), кодируется от str до bytes. Строка буквально состоит из \, x, F, F и так далее. Вы должны проанализировать str самостоятельно.

Если вам не нужно проверять ввод (читай: вы пишете отдельный сценарий, который будет выполняться только вами), любой из этих хаков следует выполнить работу:

Удалить все экземпляры \x, затем использовать binascii.unhexlify():

import crc8
import sys
import binascii

value = binascii.unhexlify(sys.argv[1].replace(r"\x", ""))
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

Разделить строку на экземпляры \x, затем вызвать int со вторым аргументом (base), установленным в 16 для каждого из str фрагментов, затем упаковать как bytes:

import crc8
import sys

value = bytes(int(byte_str, 16) for byte_str in sys.argv[1].split(r"\x")[1:])
#value = bytes(map(lambda byte: int(byte, 16), sys.argv[1].split(r"\x")[1:]))
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

Или, если вам нравится жить на грани, Python выполните анализ за вас:

import crc8
import sys

exec(f'value = b"{sys.argv[1]}"') # YOLO, FIDLAR!
hash = crc8.crc8()

hash.update(value)
print(hash.hexdigest())

Если вы пишете что-то, что будет использоваться в производстве, вам действительно нужно тщательно проверить и проанализировать ваши входные данные.

...