2014-07-07 2 views
1

입력으로 문자열을 수락하지 구조체입니다왜 내가 구조체는 문자열을 포장하지에 문제가있어

나는 현재 임의의 20 바이트 길이의 문자열을 생성하고

나는 20 개 옥텟이 사용하는 구조체를 포장 할 때 인수가이 방법을 포장 할 수 있도록 문자열을 인코딩의 빠르고 쉬운 방법이

정수로 변환 할 수 없습니다 :

payload = struct.pack("H" * 20, *rendezvous_cookie) 

    rendezvous_cookie calculated by os.urandom(20) 

아래 코드는 내가 오류 struct.error를 얻을?

payload = struct.pack('!20s', rendezvous_cookie) 

이 문자열로 벌금 입력을 받아, 20 개 옥텟

+0

어째서'struct'를 통해 이것을 먹이고 싶습니까? 문자열을 원하면 이미 가지고 있습니다. (int를 원한다면,'unpack '을 원한다.) – user2357112

+0

나는이 데이터를 패킷으로 보내기를 원한다. 20 옥텟의 페이로드에 쿠키의 데이터를 포장하고 싶다. – user2061913

+0

이미 페이로드 20이다. 옥텟 최종 struct.pack은 기본적으로 NOP입니다. 그것을 스스로 증명하십시오 :'foo = os.urandom (20); bar = struct.pack ('! 20s', foo); foo == bar' –

답변

1

os.urandom(n)가 임의의 str의를 반환의 여전히 이런 식으로 :

감사

편집을 수행하여 그것을 해결하기 위해 관리 길이 n.

당신이 그것을 밖으로 정수의 목록을 확인하려면

는 사용

[ord(b) for b in os.urandom(n)] 

당신은 struct.pack에 인수로 그 먹이를 할 수 있습니다.

그러나 os.urandom(n)은 이미 바이트의 일련화된 목록을 반환합니다. 직접 사용할 수 있습니다. struct.pack("H", ...)을 사용하면 각 숫자가 2 바이트를 차지합니다 (그 중 하나에는 데이터가 저장되지 않습니다).