#python #python-3.x #string #byte #python-unicode
#python #python-3.x #строка #байт #python-unicode
Вопрос:
У меня есть байты, и я хочу преобразовать их в строку в python?
Это байты, которые я хочу преобразовать:
b'xfeD1xc2Bxacxf86Mxxc1x0exa4xe2xx0c,xd4x1axb1'
но я не могу преобразовать его в обычные символы.
Также я предоставляю указанный выше байт в качестве входных данных.
Я пытался:
my_str = b'xfeD1xc2Bxacxf86Mxxc1x0exa4xe2xx0c,xd4x1axb1'.decode()
print(my_str)
и ошибка, которую я получаю, это:
Traceback (most recent call last):
File "E:/Mainproject.py", line 39, in <module>
my_str = b'xfeD1xc2Bxacxf86Mxxc1x0exa4xe2xx0c,xd4x1axb1'.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 0: invalid start byte
Редактировать: 1
Это код, который я использовал для кодирования текста. Здесь я пытаюсь использовать некоторую последовательность pn для шифрования введенного текста, и результирующий результат, который я получаю, — это байт.
Теперь я хочу создать другую программу, которая принимает этот байт в качестве входных данных и декодирует его в обычный текст.
from pylfsr import LFSR
# The initial state
state = [0,0,0,1,0,1,0,1,0,1,1]
# The LFSR polynomial use a primitive polynomail to get maximum period length
poly = [2,2,3,4,2]
l = LFSR(fpoly=poly, initstate =state)
print(l)
message = input().encode()
ciphertext = b""
# generate all LFSR sequence
allseq = l.runFullCycle()
seq = ""
seq_index = 0
# Convert LFSR bits into a string
for x in allseq:
seq = str(x)
for counter in range(len(message)):
ran_seq = seq[seq_index: seq_index 8]
# Now encrypt by XOR convert to bytes and append to ciphertext
# print(type(message[counter]),message[counter],type(ran_seq),ran_seq,int(message[counter]^int(ran_seq)))
ciphertext = bytes([int(message[counter]) ^ int(ran_seq, 2)])
# print(ciphertext)
seq_index = 8 # Move sequence to Next byte
print(ciphertext)
Ответ №1:
decode
преобразует bytes
в str
. encode
преобразует str
в bytes
.
my_str = b'xfeD1xc2Bxacxf86Mxxc1x0exa4xe2xx0c,xd4x1axb1'.decode()
Комментарии:
1. Я попробовал это, но получил сообщение об ошибке, которое я обновил в вопросе.
2. Имеющиеся у вас байты не представляют строку UTF-8, поэтому нет разумного способа преобразовать ее в строку. Как были созданы эти байты? Если они были созданы с использованием другой кодировки, вы можете указать это в
decode(encoding='whatever')
3. @martineau, использующий это, не дал мне никакой ошибки, но в то же время он также не расшифровал правильный вывод: (
Ответ №2:
Вам нужно использовать latin1
кодировку, но это имеет последствия, если эти байты не являются латинскими символами, в итоге вы получите символ Моджибаке, что, по-видимому, имеет место в вашей ситуации. Можете ли вы сказать, что это за строка?
my_str = b'xfeD1xc2Bxacxf86Mxxc1x0exa4xe2xx0c,xd4x1axb1'
print(my_str.decode("latin1"))
РЕДАКТИРОВАТЬ: вы пытаетесь расшифровать зашифрованный ciphertext
и вернуть свой текст без привязки, что и пытается предотвратить шифрование, чтобы вернуть свой текст, вам нужно сначала расшифровать, а затем декодировать, используя этот код:
from pylfsr import LFSR
state = [0,0,0,1,0,1,0,1,0,1,1]
poly = [2,2,3,4,2]
l = LFSR(fpoly=poly, initstate =state)
print(l)
message = input("Enter message to encrypt: ").encode()
ciphertext = b""
allseq = l.runFullCycle()
seq = ""
seq_index = 0
for x in allseq:
seq = str(x)
for counter in range(len(message)):
ran_seq = seq[seq_index: seq_index 8]
ciphertext = bytes([int(message[counter]) ^ int(ran_seq, 2)])
seq_index = 8 # Move sequence to Next byte
print(ciphertext)
ciphertext_file_name = "ciphertext"
with open(ciphertext_file_name, "wb") as out_file:
out_file.write(ciphertext)
# Read ciphertext and decrypt it
with open(ciphertext_file_name, "rb") as in_file:
ciphertext = in_file.read()
seq_index = 0
plaintext_again = b""
for counter in range(len(ciphertext)):
ran_seq = seq[seq_index: seq_index 8]
plaintext_again = bytes([int(ciphertext[counter]) ^ int(ran_seq, 2)])
seq_index = 8 # Move sequence to Next byte
print(plaintext_again.decode("latin1"))
Комментарии:
1. Да, верно, я пробовал и получил символы Моджибаке: (
2. @WOZNIK На каком языке эта строка?
3. Русский, ‘Это обычный текст’ <- это строка, которую я закодировал
4. @WOZNIK: Байтовые данные, указанные в вашем вопросе, не являются таким простым текстом.
5. @WOZINIK можете ли вы отредактировать свой вопрос, указав, как вы закодировали этот открытый текст, поскольку этот обычный текст, похоже, не относится к строке байтов