2010-03-27 22 views
5

Tôi cần truyền một mảng có độ dài thay đổi trong đó mỗi phần tử là một bộ gồm hai số nguyên. Ví dụ:Python: Cách truyền các mảng chiều dài biến đổi qua kết nối mạng

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

Tôi đang cố gắng sử dụng gói và giải nén, tuy nhiên, vì mảng có độ dài khác nhau nên tôi không biết cách tạo định dạng sao cho cả hai đều biết định dạng. Tôi đã cố gắng để biến nó thành một chuỗi duy nhất với delimiters, chẳng hạn như:

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

ở phía bên nhận:

path = unpack("s",msg) 

nhưng điều đó chỉ in 1 trong trường hợp này. Tôi cũng đang cố gắng gửi 4 số nguyên, gửi và nhận tiền phạt, miễn là tôi không bao gồm chuỗi thừa đại diện cho đường dẫn.

sendMsg = pack ("hhhh", p.direction [0], p.direction [1], p.id, p.health)

ở phía bên nhận:

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

Việc đầu tiên là để minh họa như tôi đã cố gắng để gửi định dạng "hhhhs", nhưng một trong hai cách con đường không đi qua đúng cách.

Cảm ơn sự giúp đỡ của bạn. Tôi cũng sẽ xem xét việc gửi một mảng 2D của int, nhưng tôi không thể tìm ra cách để gửi các cấu trúc phức tạp hơn này trên mạng.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

0

Nếu bạn bao gồm độ dài tin nhắn như một phần của tin nhắn, thì bạn sẽ biết lượng dữ liệu cần đọc. Vì vậy, toàn bộ chuỗi nên được đọc trên mạng.

Trong mọi trường hợp, có lẽ sẽ hữu ích nếu bạn đăng một số mã bạn đang sử dụng để gửi dữ liệu qua mạng hoặc ít nhất cung cấp nhiều mô tả hơn.

0

Đóng gói và giải nén là bắt buộc? Nếu không, bạn có thể sử dụng JSONYAML.

Không sử dụng pickle vì không an toàn.

+0

Như Mark Byers đề cập, dưa không an toàn nếu bạn đang sử dụng trên mạng mà bạn không muốn bất kỳ ai gửi dữ liệu để có thể chạy mã tùy ý trên máy của người nhận. http://nadiana.com/python-pickle-insecure – keturn

+0

Tôi đã không nhận thức được những khả năng "khai thác" này. – systempuntoout

7

Mặc dù bạn có thể sử dụng gói và giải nén, tôi khuyên bạn nên sử dụng một cái gì đó như YAML hoặc JSON để chuyển dữ liệu của bạn.

  • Đóng gói và giải nén có thể dẫn đến khó gỡ lỗi và không tương thích nếu bạn thay đổi giao diện và có các phiên bản khác nhau cố gắng liên lạc với nhau.
  • Pickle có thể cung cấp security problems và định dạng dưa có thể thay đổi giữa các phiên bản Python.

JSON được bao gồm trong phân phối Python chuẩn từ 2.6. Đối với YAML có PyYAML.

+0

+1 Tôi đã không nhận thức được những khả năng "khai thác" này. Cảm ơn Mark – systempuntoout

0

Hãy xem xdrlib, nó có thể hữu ích. Đó là một phần của thư viện chuẩn, và:

Module xdrlib hỗ trợ Data Đại diện tiêu chuẩn ngoài như mô tả trong RFC 1014, được viết bởi Sun Microsystems, Inc. tháng sáu năm 1987. Nó hỗ trợ hầu hết các loại dữ liệu được mô tả trong RFC .

Các vấn đề liên quan