2017-02-04 1 views
0

char 'x'형식의 파이썬 struct.pack_into는 더 많은 바이트를 필요로합니다.

나는 내 자신의 IP, TPC, UDP 헤더를 쓸 수 있도록 파이썬 바이트 배열에 대해 배우려고합니다. 파이썬에서 구조체를 사용하여 이진 데이터를 압축하고 압축을 풀어 지정된 형식의 문자열이 주어진다. 나는 위의 코드에 따라 형식으로 ">bx"으로 길이 2의 버퍼로 팩을 할 때struct.pack_into 다음에 더 많은 바이트가 필요합니다.

ba2 = bytearray(2) 
print(ba2, "The size: ", ba2.__len__()) 
struct.pack_into(">bx", ba2, 1, 1) 

print(struct.unpack(">bx", ba2)) 

지금, 나는 오류 얻을 :

bytearray(b'\x00\x00') The size: 2 
Traceback (most recent call last): 
    File "D:/User/Documents/Python/Network/Main.py", line 58, in <module> 
    bitoperations_bytes_bytearrays_test() 
    File "D:/User/Documents/Python/Network/Main.py", line 49, in bitoperations_bytes_bytearrays_test 
    struct.pack_into(">bx", ba2, 1, 1) 
struct.error: pack_into requires a buffer of at least 2 bytes 

을하지만 난 2 바이트의 바이트 배열이 .

내가 뭘 잘못하고 있니?

내가 놓친 경우 일부 문서를 참조하십시오. 파이썬 문서를 읽었지만 놓친 것 같습니다.

편집 : 나는 불분명 경우

죄송합니다. 하지만 난 바이트 배열에서 두 번째 바이트를 변경하고 싶습니다. 따라서 'x'는 형식으로 채워집니다.

그리고 난 그냥 thiss 같은 형식으로 'x'를 제외하는 것입니다 인 것처럼 바보 :

struct.pack_into(">b", ba2, 1, 1) 

오른쪽 포장 벤이 만든 것입니다. 이 출력을 사용하면 :

bytearray(b'\x00\x00') The size: 2 
A pack with one byte shift: 0001 
(0, 1) 

답변

0

그리고 난 그냥 thiss 같은 형식으로 'x'를 제외하는 것입니다 인 것처럼 바보 :

struct.pack_into(">b", ba2, 1, 1) 

와 벤이 만든 것 권리 포장 코드를 따르는 것은 문제를 해결합니다. 이 출력 결과는 다음과 같습니다.

bytearray(b'\x00\x00') The size: 2 
A pack with one byte shift: 0001 
(0, 1) 
1

pack_into() 함수 호출에 추가 매개 변수가 하나 필요합니다. 세 번째 매개 변수는 필수이며 대상 버퍼에서 오프셋됩니다 (https://docs.python.org/2/library/struct.html 참조). 1 바이트 만 예상하기 때문에 형식도 잘못되었습니다.

import struct 

ba2 = bytearray(2) 
print(ba2, "The size: ", ba2.__len__()) 
struct.pack_into("bb", ba2, 0, 1, 1) 

print(struct.unpack("bb", ba2)) 
+0

응답 해 주셔서 감사합니다. 하지만 그것을 변경하지 않고 첫 번째 바이트의 왼쪽에 단지 바이트 (00000001)를 추가 할 수 있기를 원합니다. 따라서 패드 바이트 x를 변경하십시오. 헤더에 필드를 추가하고 싶다면 처음부터 오프셋 (이 경우 1)을 만들고 첫 번째 공백을 채우지 않아도됩니다. –

관련 문제