我有一个字节,我想在 python 中将其转换为字符串?
这些是我要转换的字节:
b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'
但我无法将其转换为普通字符。
我还提供上述字节作为输入。
我试过:
my_str = b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'.decode()
print(my_str)
我得到的错误是:
Traceback (most recent call last):
File "E:/Mainproject.py", line 39, in <module>
my_str = b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'.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)
decode
将 bytes
转换为 str
。 encode
将 str
转换为 bytes
。
my_str = b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'.decode()
您需要使用
latin1
编码,但这会产生以下后果:如果这些字节是非拉丁字符,您最终会得到 Mojibake 字符,这在您的情况下似乎就是这种情况。你能说出这是什么线吗?
my_str = b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'
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"))