19

Is there any function equivalent to Python's struct.pack in Java that allows me to pack and unpack values like this?

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

4 Answers 4

10

I think what you may be after is a 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();
Sign up to request clarification or add additional context in comments.

3 Comments

ByteBuffer doesn't allow you to write Strings, and the contractor requires a buffer size limitation - you need to pre-decide how long your input would be.
@Yonatan, it does allow you to write strings: buf.put(s.getBytes()). ByteBuffer requires you to specify the capacity when initially allocating the buffer. Are you saying this is a good thing or a bad thing?
@SimonC ByteBuffer does allow you two write strings in the manner you have shown. However, s.getBytes() will return a UTF-8 encoded byte array from the string (still variable length). It will not have a trailing zero. Beyond that buf.put() uses the current position in the ByteBuffer. This may not be exactly what you want.
4

Something like this:

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

Later, you can read that data:

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

2 Comments

DataOutputStream is good for java primitives only. ObjectOutputStream (which also implements DataOutput interface) gives you ability to write primitives and serializable objects.
in this code example it should be data.toByteArray() there is no toByteArray on DataOutputStream but instead is available on the ByteArrayOutputStream
4

I started development of project which is very close to Python Struct: java-binary-block-parser in JBBP it will look like

JBBPOut.BeginBin().Int(0,0).Short(21,96).Int(512).End().toByteArray();

Comments

1

Closest feature in core Java is Serialization. It converts object into byte sequence and back.

2 Comments

CAn't believe you. Even as I dislike Java, there should be something closer to being able to do things like this than serialization: Serialization gives you no control on which actual bytes are being created - it just allows you to recreate the same object with those bytes.
By default it gives you no control, but you can always customize it. Hint: search for readObject/writeObject on the page I gave you a link to. If that is not enough, check out download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.