2010-07-09 48 views
15

Có chức năng nào tương đương với Python struct.pack trong Java cho phép tôi đóng gói và giải nén các giá trị như thế này không?Java tương đương với struct.pack của Python?

pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512) 
+0

Có câu trả lời nào được chấp nhận cho câu hỏi này không? – Xofo

+0

Nó không phải là tương đương chính xác của gói Python nhưng có lẽ nó sẽ giúp bạn anyway: https://github.com/marc-christian-schulze/structs4java –

Trả lời

1

Tính năng gần nhất trong lõi Java là Serialization. Nó chuyển đổi đối tượng thành chuỗi byte và ngược lại.

+0

Đừng tin bạn. Ngay cả khi tôi không thích Java, cần phải có thứ gì đó gần gũi hơn để có thể làm những việc như thế này hơn serialization: Serialization cho phép bạn không kiểm soát các byte thực đang được tạo ra - nó chỉ cho phép bạn tạo lại cùng một đối tượng với các byte đó. – jsbueno

+0

Theo mặc định, nó cung cấp cho bạn quyền kiểm soát, nhưng bạn luôn có thể tùy chỉnh nó. Gợi ý: tìm kiếm readObject/writeObject trên trang tôi đã cung cấp cho bạn một liên kết đến. Nếu điều đó không đủ, hãy xem http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/Externalizable.html –

8

Tôi nghĩ rằng những gì bạn có thể sau là một ByteBuffer:

ByteBuffer pump_on_buf = ... 
pump_on_buf.putInt(0); 
pump_on_buf.putInt(0); 
pump_on_buf.putShort(21); 
pump_on_buf.putShort(96); 
pump_on_buf.putInt(512); 
byte[] pump_on = pump_on_buf.array(); 
+0

ByteBuffer không cho phép bạn viết Chuỗi, và nhà thầu yêu cầu giới hạn kích thước bộ đệm - bạn cần phải quyết định trước thời gian đầu vào của mình. – Yonatan

+0

@Yonatan, nó cho phép bạn viết các chuỗi: 'buf.put (s.getBytes())'. 'ByteBuffer' yêu cầu bạn chỉ định dung lượng khi ban đầu phân bổ bộ đệm. Bạn đang nói đây là một điều tốt hay một điều xấu? – SimonC

+0

@SimonC ByteBuffer cho phép bạn viết hai chuỗi theo cách bạn đã hiển thị. Tuy nhiên, s.getBytes() sẽ trả về một mảng byte được mã hóa UTF-8 từ chuỗi (còn chiều dài biến đổi). Nó sẽ không có dấu 0. Ngoài ra buf.put() sử dụng vị trí hiện tại trong ByteBuffer. Điều này có thể không chính xác những gì bạn muốn. –

3

Something như thế này:

final ByteArrayOutputStream data = new ByteArrayOutputStream(); 
final DataOutputStream stream = new DataOutputStream(data); 
stream.writeUTF(name); 
stream.writeUTF(password); 
final byte[] bytes = stream.toByteArray(); // there you go 

Sau đó, bạn có thể đọc dữ liệu:

final DataInputStream stream = new DataInputStream(
    new ByteArrayInputStream(bytes) 
); 
final String user = stream.readUTF(); 
final String password = stream.readUTF(); 
+0

DataOutputStream chỉ tốt cho các nguyên thủy java. ObjectOutputStream (cũng thực hiện giao diện DataOutput) cung cấp cho bạn khả năng viết các đối tượng nguyên thủy và có thể tuần tự hóa được. – Yonatan

1

Tôi bắt đầu phát triển dự án rất gần với Python Struct: java-binary-block-parser trong JBBP nó sẽ trông giống như

JBBPOut.BeginBin().Int(0,0).Short(21,96).Int(512).End().toByteArray(); 
Các vấn đề liên quan