如何将字节转换为字符串?

问题描述 投票:0回答:2

我有一个字节,我想在 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)
python python-3.x string byte python-unicode
2个回答
0
投票

decode
bytes
转换为
str
encode
str
转换为
bytes

my_str = b'\xfeD1\xc2B\xac\xf86Mx\xc1\x0e\xa4\xe2x\x0c,\xd4\x1a\xb1'.decode()

0
投票

您需要使用

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"))
© www.soinside.com 2019 - 2024. All rights reserved.