문자열을 그대로 바이트 열 객체로 변환

user70960

문자열을 인코딩하지 않고 그대로 바이트 객체로 바꾸려면 어떻게해야합니까? .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을 처음 사용하므로이 작업을 올바르게 수행하는 더 좋은 방법이 있는지 모르겠습니다.


해결됨 (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
존 헤니 그

문자열을 인코딩하지 않고 그대로 바이트 객체로 바꾸려면 어떻게해야합니까?

당신은 할 수 없습니다. 그것은 용어의 모순입니다 — 파이썬 3부터.

문자열은 텍스트 문자의 순서입니다. 문자, 구두점, 공백, 심지어 제어 문자를 생각하십시오. 바이트 목적은 8 비트의 시퀀스이다. 두 시퀀스가 ​​어떻게 관련되어 있는지는 인코딩 문제입니다. 주위에 방법이 없습니다.

텍스트 문자는 추상 엔티티로 간주되어야합니다. 예를 들어 문자 A는 단순히 존재합니다. 그 자체로 는 번호가 없습니다 . (내부적 으로 는 숫자 인 유니 코드 코드 포인트로 표시 되지만 구현 세부 사항입니다.)

위의 코드에서, 당신은 바이트를 읽고 있고, 바이트를 쓰고 있고, 그 사이에 바이트 스트림을 조작하기를 원합니다. 숫자 중 하나를 변경하고 다른 것을 추가합니다.

파이썬 bytesstr그 점에서 다르지 않습니다 . 둘 다 불변 유형입니다. 위와 동일하지만 문자열을 사용하면 동일한 종류의 오류가 발생합니다.

>>> 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    셀레늄의 모델 대화 상자에서 텍스트를 추출하는 방법은 무엇입니까?

  2. 2

    Blazor 0.9.0 및 ASP.NET Core 3 미리보기 4를 사용한 JWT 인증

  3. 3

    openCV python을 사용하여 텍스트 문서에서 워터 마크를 제거하는 방법은 무엇입니까?

  4. 4

    C # 16 진수 값 0x12는 잘못된 문자입니다.

  5. 5

    Excel : 합계가 N보다 크거나 같은 상위 값 찾기

  6. 6

    오류 : MSB4803 : MSBuild의 .NET Core 버전에서 "ResolveComReference"작업이 지원되지 않습니다.

  7. 7

    R에서 Excel로 내보낼 때 CET / CEST 시간 이동이 삭제됨

  8. 8

    node.js + postgres : "$ 1"또는 그 근처에서 구문 오류

  9. 9

    확대 후 하이 차트에서 Y 축이 잘못 정렬 됨

  10. 10

    EPPlus에서 행 높이를 설정할 때 이상한 동작

  11. 11

    Ionic 2 로더가 적시에 표시되지 않음

  12. 12

    MS Access 부분 일치 2 테이블

  13. 13

    EPPlus에서 병합 된 셀의 행 높이 자동 맞춤

  14. 14

    ExecuteNonQuery- 연결 속성이 초기화되지 않았습니다.

  15. 15

    ResponseEntity를 사용하고 InputStream이 닫히는 지 확인하는 적절한 스트리밍 방법

  16. 16

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  17. 17

    오류 : "const wchar_t *"유형의 인수가 "WCHAR *"유형의 매개 변수와 호환되지 않습니다.

  18. 18

    Java에서 이미지를 2 색으로 변환

  19. 19

    overflow-y를 사용할 때 스크롤 버벅 거림 줄이기 : scroll;

  20. 20

    Java에서 Apache POI를 사용하여 테이블 크기 및 간격을 단어로 설정하는 방법

  21. 21

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

뜨겁다태그

보관