문자열을 인코딩하지 않고 그대로 바이트 객체로 바꾸려면 어떻게해야합니까? .encode()
저장 후 바이너리 파일이 손상되기 때문에 여기서 사용할 수 없습니다 .
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
그래서이 대신 :
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
나는 이것을 얻는다 :
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
나는 바이트 객체 자체를 수정하려고 시도했지만 항상 그 오류가 발생합니다.
TypeError : 'bytes'개체는 항목 할당을 지원하지 않습니다.
저는 Python을 처음 사용하므로이 작업을 올바르게 수행하는 더 좋은 방법이 있는지 모르겠습니다.
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
문자열을 인코딩하지 않고 그대로 바이트 객체로 바꾸려면 어떻게해야합니까?
당신은 할 수 없습니다. 그것은 용어의 모순입니다 — 파이썬 3부터.
문자열은 텍스트 문자의 순서입니다. 문자, 구두점, 공백, 심지어 제어 문자를 생각하십시오. 바이트 목적은 8 비트의 시퀀스이다. 두 시퀀스가 어떻게 관련되어 있는지는 인코딩 문제입니다. 주위에 방법이 없습니다.
텍스트 문자는 추상 엔티티로 간주되어야합니다. 예를 들어 문자 A는 단순히 존재합니다. 그 자체로 는 번호가 없습니다 . (내부적 으로 는 숫자 인 유니 코드 코드 포인트로 표시 되지만 구현 세부 사항입니다.)
위의 코드에서, 당신은 바이트를 읽고 있고, 바이트를 쓰고 있고, 그 사이에 바이트 스트림을 조작하기를 원합니다. 숫자 중 하나를 변경하고 다른 것을 추가합니다.
파이썬 bytes
은 str
그 점에서 다르지 않습니다 . 둘 다 불변 유형입니다. 위와 동일하지만 문자열을 사용하면 동일한 종류의 오류가 발생합니다.
>>> s = 'abcd'
>>> s[3] = 'x'
TypeError: 'str' object does not support item assignment
즉, 문자열에 대해서는 내부 문자 조작이 지원되지 않습니다. 그래도 동일한 결과를 얻는 다른 방법이 있습니다. 반면에 인플레 이스 바이트 조작 이 지원됩니다. 이는 문자열보다 더 일반적인 사용 사례이기 때문입니다. bytearray
대신 bytes
다음 을 사용해야 합니다 .
>>> data = bytearray(b'\x00\x01\x02\x03\x04')
>>> data[3] = 255
>>> print(data)
bytearray(b'\x00\x01\x02\xff\x04')
그런 다음 인코딩없이 파일에 쓸 수 있습니다.
pathlib.Path('result.bin').write_bytes(data)
( bytes
리터럴은 접두사로 시작해야합니다 b
.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다