Converter uma string em um objeto de bytes como está

user70960

Como faço para transformar uma string em um objeto de bytes COMO ESTÁ, ou seja, sem codificá-lo. Não posso usar .encode()aqui, porque está corrompendo meu arquivo binário depois de salvar.

filedata = pathlib.Path('file.bin').read_bytes()
# since i can't modify a bytes object, i should convert it to a string, should I?
data = ''
for i in filedata:
    data += chr(i) if isinstance(i, int) else i
data[3] = '\x01'
data += '\x58\x02\x0C\x80\x61\x39\x56\x18\x55\x61\x89\x42\x42\x16\x46\x17\x54\x70\x10\x58\x60\x10\x10\x01\x75\x10\xF0\xC0\x00\x01\x00\x02\x00\xC0\x00\xD0\x00\x01\x00\xC4\x00\x01\x00\x02\x00\x01\x00\x00\x02\x00\x00\x00'
pathlib.Path('result.bin').write_bytes(data.encode()) # doesn't work as it should

Então, em vez disso:

58 02 0C 80 61 39 56 18 55 61 89 42 42 16 46 17 54 70 10 58 60 10 10 01 75 10 F0 C0 00 01 00 02 00 C0 00 D0 00 01 00 C4 00 01 00 02 00 01 00 00 02 00 00 00

Eu entendi isso:

58 02 0C C2 80 61 39 56 18 55 61 C2 89 42 42 16 46 17 54 70 10 58 60 10 10 01 75 10 C3 B0 C3 80 00 01 00 02 00 C3 80 00 C3 90 00 01 00 C3 84 00 01 00 02 00 01 00 00 02 00 00 00

tentei modificar o próprio objeto bytes, mas sempre recebo esse erro:

TypeError: o objeto 'bytes' não suporta atribuição de item

Eu sou novo em Python, então não sei se existem maneiras melhores de fazer isso direito.


Resolvido (graças a John):

filedata = bytearray(pathlib.Path(sys.argv[1]).read_bytes())
# filedata = bytearray(open(sys.argv[1], 'rb').read()) also works
filedata[1] = 255 # modifying a single byte (0 - 255)
filedata[0:1] = b'\xff' # inserting bytes
filedata.extend(255) # appending one single byte
filedata.extend(filedata2) # appending another array of bytes (bytearray object)
filedata.extend(b'\xff\xff') # appending bytes
filedata.extend([255, 255]) # appending bytes too
pathlib.Path(sys.argv[1]).write_bytes(filedata) # write data to a file
# open(sys.argv[1], 'rb').write(filedata) should work too
John Hennig

Como faço para transformar uma string em um objeto de bytes COMO ESTÁ, ou seja, sem codificá-la?

Você não pode. Isso é uma contradição de termos - a partir do Python 3.

Uma string é uma sequência de caracteres de texto. Pense em letras, pontuação, espaço em branco e até caracteres de controle. Um objeto de bytes é uma sequência de números de 8 bits. Como as duas sequências estão relacionadas é uma questão de codificação. Não há maneira de contornar isso.

Os caracteres de texto devem ser considerados entidades abstratas. A letra A, por exemplo, simplesmente existe. Não há nenhum número associado a ele per se . (Internamente, é representado por um ponto de código Unicode, que é um número, mas é um detalhe de implementação).

No código acima, você está lendo bytes e escrevendo bytes, e no meio você deseja manipular o fluxo de bytes: mude um dos números, acrescente outros.

Python bytesnão é diferente strnesse aspecto: ambos são tipos imutáveis. Se você fez o mesmo que acima, mas com uma string, obterá o mesmo tipo de erro:

>>> s = 'abcd'
>>> s[3] = 'x'
TypeError: 'str' object does not support item assignment

Ou seja, a manipulação de caracteres no local não é compatível com strings. No entanto, existem outras maneiras de obter o mesmo resultado. A manipulação de bytes no local, por outro lado, é suportada - provavelmente porque é um caso de uso mais comum do que para strings. Você só precisa usar em bytearrayvez de bytes:

>>> data = bytearray(b'\x00\x01\x02\x03\x04')
>>> data[3] = 255
>>> print(data)
bytearray(b'\x00\x01\x02\xff\x04')

Que você pode gravar em um arquivo sem qualquer codificação:

pathlib.Path('result.bin').write_bytes(data)

(Observe que os bytesliterais devem ser prefixados com b.)

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como converter uma string de bytes em um int?

Como converter o objeto de classe de bytes em um objeto de string

Como converter o objeto de classe de bytes em um objeto de string

Como posso converter uma matriz de bytes em um objeto definido pelo usuário?

Como converter um objeto em uma string com uma string de formato?

Como converter uma string em um objeto em JavaScript

Como posso converter uma string terminada em nulo em um buffer de bytes em uma string no Go?

Como converter um dataframe do pandas em uma string de bytes?

Como converter um uint16 em uma string de 2 bytes no Go?

Como faço para converter um vetor de bytes (u8) em uma string

Como obter um único byte em uma string de bytes, sem converter para int

Como converter um double em uma matriz de bytes no swift?

Como converter uma string que representa um intervalo de tempo em um objeto struct_time?

Como converter um objeto em uma string sem adicionar um monte de vírgulas?

Como converter um objeto em uma string sem adicionar um monte de vírgulas?

Como converter uma string passada em um objeto jQuery?

Como converter uma string em um objeto datetime

como converter uma string java em um objeto Date

Como converter uma string em um objeto stream no Powershell?

Como faço para converter uma string em um objeto

Como converter uma string formatada como variável de array em um objeto javascript?

Como converter uma string de Retrofit em um objeto personalizado no meu modelo de classe de dados?

Como converter uma string hash em matriz de bytes no PowerShell?

Como converter uma matriz de bytes em string hexadecimal?

Como posso converter uma string que está codificada em byte em um valor de string anterior?

Como converter uma string em uma matriz de bytes que é compilada com um determinado conjunto de caracteres em Go?

Como converter a matriz de resposta mongodb de um objeto javascript em uma string JSON

Como converter uma string em um plug-in do Bukkit de objeto de localização

Como posso converter uma matriz de bytes C # em uma string binária a ser colada em um script SQL?