2013-02-19 3 views
2

다른 출력 파일에 쓰는 Python으로 열어 본 파일이 있습니다. 나는 그것이 파일 크기 16의 배수 여야합니다, 그래서 이것은 내가 고안 한 것입니다 :문자열에 바이트를 추가 하시겠습니까?

AttributeError: 'str' object has no attribute 'extend' 

먼저, 왜을 수행

with open(input_file, 'rb') as infile: 
    with open(output_file, 'wb') as outfile: 
     while True: 
      input_chunk = infile.read(64) 

      if len(input_chunk) == 0: 
       break 
      elif len(input_chunk) % 16 > 0: 
       input_chunk.extend([0 for i in range(len(input_chunk) % 16)]) 

      output_file.write(input_chunk) 

불행하게도, 그것은과 제로를 추가 실패 바이트 배열이 아니라 여기에 문자열이 있습니까? 이진 파일을 이진 모드로 읽는 중입니다.

둘째, 문자열을 처리하는 경우 문자열의 끝에 0 값을 가진 바이트를 어떻게 작성합니까?

+0

문자열은 불변 객체입니다. – JBernardo

+1

아마도 input_chunk = input_chunk + '\ 0'* (len (input_chunk) % 16) – Hyperboreus

+0

바이트 배열로 파일을 읽을 수있는 방법이 있습니까? –

답변

4

첫째, 내가 여기에 문자열이 왜,보다는 당신이 변경 가능한 배열을해야하는 경우

는 2.6+ 버전에이 ByteArray를 사용 바이트의 배열?

그게 내가 문자열을 처리하고있어 경우 file.read 반환 ...

둘째, 어떻게 그 문자열의 마지막 값을 0 바이트의 수를 작성하려면 어떻게해야합니까 무엇 때문에?

문자열을 변경할 수 없기 때문에 문자열에 쓸 수 없습니다. 당신은 그러나 다른 문자열에 그것을 작성하고 연결하여 새로운 문자열을 만들 수 있습니다

>>> import struct 
>>> input_chunk = 'foo bar baz' 
>>> input_chunk + struct.pack('16B',*([0]*16)) 
'foo bar baz\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> 

당신은 당신이 64 바이트를 가지고 있음을 알고 당신은 80 바이트 널 (null)으로 채워집니다 문자열, struct.pack 의지 패드를 원하는 경우 자동으로 널 (null)와 그것을 : 's'형식 문자

struct.pack('80s',string_of_64_bytes) 

는 카운트 문자열이 아닌 다른 형식의 문자와 같은 반복 횟수의 크기로 해석됩니다; 예를 들어, '10'은 10 바이트 문자열을 의미하고 '10c'는 10 문자를 의미합니다. 카운트가 주어지지 않은 경우, 디폴트는 1입니다. 패킹의 경우, 캐릭터 라인은 잘라 버려 지거나 적합하게하기 위해서 null 바이트로 패딩됩니다. 압축을 풀 때 결과 문자열은 항상 정확히 지정된 바이트 수를 갖습니다. 특수한 경우로 '0'은 빈 문자열 하나를 의미합니다 ('0c'는 0 문자를 의미 함).

+0

OP가 AES 암호화를 시도하는 것 같습니다. 이 경우 패딩이 모두 null이 아니어야합니다. [RFC 5652에 따른 PKCS # 7 채우기] (http://tools.ietf.org/html/rfc5652#section-6.3)에 따라야하며 추가 된 각 바이트의 값인 바이트로 채워야합니다 . – Tux

2

Python 2.x에서 str 개체는 "바이트 배열"입니다. 그렇지 않으면

>>> a = bytearray('my_string') 
>>> a.extend(' hello') 
>>> str(a) 
'my_string hello' 

:

>>> import array 
>>> a = array.array('c', 'my_string') 
+0

2.7에서는'bytearray'도 사용합니다. – DSM

+0

실제로 'bytearray'는 2.6 [bytearray] (http://docs.python.org/2/library/functions.html#bytearray) – wasserfeder

+0

@wasserfeder 이후 사용할 수 있습니다. 그러면 bytearray가 더 나은 선택이됩니다. – JBernardo

1

그냥 bytearray을 사용하고있는 그대로 당신이 잘되어야합니다 :

  input_chunk = bytearray(infile.read(64)) 

난 그냥 패딩 지능형리스트 대신 [0] * (16 - len(input_chunk)%16) 같은 것을 사용하는 것이 있지만.당신은 패드 수

0

input_chunk

이 같은
input_chunk += '\x00'*(-len(input_chunk)%16) 
+0

어떻게 int를 이와 같이 바이트로 변환 할 수 있습니까? '\ x00'은 동적이어야합니다. len (input_chunk) % 16의 나머지 부분으로 바꿀 것이기 때문입니다. –

관련 문제