Как преобразовать байты в строку?

#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 можете ли вы отредактировать свой вопрос, указав, как вы закодировали этот открытый текст, поскольку этот обычный текст, похоже, не относится к строке байтов