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.
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
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 bytes
não é diferente str
nesse 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 bytearray
vez 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 bytes
literais devem ser prefixados com b
.)
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras