2010-03-27 5 views
5

각 요소가 두 정수의 튜플 인 다양한 길이의 배열을 전송해야합니다. 예를 들어 : 배열 내가 모두 형식을 알고있는 형식은 만드는 방법을 모르는 다양한 길이 때문에Python : 네트워크 연결을 통해 가변 길이 배열을 전송하는 방법

path = [(1,1),(1,2)] 
path = [(1,1),(1,2),(2,2)] 

그러나 나는 팩을 사용하여 압축을 풀려고 노력하고있다. 수신 측

msg = 1&1~1&2~ 
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg)) 

:

path = unpack("s",msg) 

을하지만 그것은 단지이 경우에 1을 출력 I는 다음과 같은 구분 기호와 함께 단일 문자열로 돌려하려고했다. 나는 또한 경로를 표현하는 여분의 문자열을 포함하지 않는 한, 4 개의 정수를 보내고 받는다.

sendMsg = 팩 수신 측 ("HHHH"p.direction [0] p.direction [1] p.id, p.health)

:

x,y,id,health = unpack("hhhh",msg) 

첫 번째는 일러스트레이션을 위해 "hhhhs"형식을 보내려고했지만 경로가 제대로 전달되지 않는 경우입니다.

도움 주셔서 감사합니다. 또한 int의 2D 배열을 보려고합니다. 그러나 이러한 복잡한 '구조를 네트워크를 통해 보내는 방법을 알아낼 수 없습니다.

도움 주셔서 감사합니다.

답변

0

메시지의 일부로 메시지 길이를 포함하면 읽을 데이터의 양을 알 수 있습니다. 따라서 전체 문자열을 네트워크에서 읽어야합니다.

어쨌든 네트워크를 통해 데이터를 보내는 데 사용하는 코드 중 일부를 게시하거나 최소한 자세한 설명을 제공하면 도움이 될 수 있습니다.

0

포장 및 포장을 풀어야합니까? 그렇지 않은 경우 JSONYAML을 사용할 수 있습니다.

pickle은 안전하지 않기 때문에 사용하지 마십시오.

+0

마크 바이어스 (Mark Byers)는 데이터를 보내는 사람이 수신자의 컴퓨터에서 임의의 코드를 실행할 수 없도록하려는 네트워크에서이 장치를 사용하는 것은 안전하지 않습니다. http://nadiana.com/python-pickle-insecure – keturn

+0

나는 이러한 가능한 "악용"에 대해 몰랐습니다. – systempuntoout

7

pack 및 unpack을 사용할 수 있지만 데이터를 전송하려면 YAML 또는 JSON과 같은 것을 사용하는 것이 좋습니다.

  • 인터페이스를 변경하고 서로 다른 버전으로 서로 통신을 시도하면 압축 및 압축 해제가 오류 및 비 호환성을 디버그하기 어려울 수 있습니다.
  • 피클은 security problems을 제공 할 수 있으며 피클 형식은 파이썬 버전간에 변경 될 수 있습니다.

JSON은 2.6 이후 표준 Python 배포판에 포함되어 있습니다. YAML의 경우 PyYAML입니다.

+0

+1 나는 이러한 가능한 "악용"에 대해 몰랐습니다. 감사 마크 – systempuntoout

0

xdrlib을 살펴보면 도움이 될 것입니다. 그것은 표준 라이브러리의 일부, 그리고 : RFC 1014에 설명 된대로

xdrlib 모듈는 Sun Microsystems, Inc.의 6월 1987 그것은 RFC에 설명 된 데이터 형식의 대부분을 지원에 의해 작성, 외부 데이터 표현 표준을 지원합니다 .