Java中与Python的struct.pack相当的方法是什么?

19
在Java中是否有与Python的struct.pack相当的功能,允许我像这样打包和解包值?
pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512)

这个问题有被接受的答案吗? - Xofo
这不是Python的pack的完全等价物,但也许它能帮到你:https://github.com/marc-christian-schulze/structs4java - Marc-Christian Schulze
4个回答

9

我认为你可能需要的是一个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();

ByteBuffer不允许您写入字符串,并且构造函数要求缓冲区大小限制 - 您需要预先决定输入的长度。 - Yonatan
@Yonatan,它确实允许您编写字符串:buf.put(s.getBytes())ByteBuffer在最初分配缓冲区时需要指定容量。您是说这是好事还是坏事? - SimonC
@SimonC ByteBuffer确实允许您以您展示的方式写入字符串。但是,s.getBytes()将从字符串返回一个UTF-8编码的字节数组(仍然是可变长度)。它不会有尾随零。除此之外,buf.put()使用ByteBuffer中的当前位置。这可能不完全符合您的要求。 - Peter Schaeffer

4

类似这样的:

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

稍后,您可以读取那些数据:
final DataInputStream stream = new DataInputStream(
  new ByteArrayInputStream(bytes)
);
final String user = stream.readUTF();
final String password = stream.readUTF();

DataOutputStream 仅适用于 Java 原始类型。ObjectOutputStream(也实现了 DataOutput 接口)使您能够编写原始类型和可序列化对象。 - Yonatan
1
在这个代码示例中,应该使用data.toByteArray()。DataOutputStream上没有toByteArray方法,但是可以在ByteArrayOutputStream上找到它。 - keios

4

我开始开发一个与Python Struct非常接近的项目:java-binary-block-parser。在JBBP中,它看起来像:

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

1

在核心Java中,最接近的功能是序列化。它将对象转换为字节序列,然后再转换回来。


我不敢相信你。尽管我不喜欢Java,但应该有比序列化更接近能够做到这样的事情的东西:序列化无法控制创建哪些实际字节 - 它只允许您使用这些字节重新创建相同的对象。 - jsbueno
默认情况下,它不提供任何控制,但您始终可以自定义它。提示:在我提供链接的页面上搜索readObject/writeObject。如果这还不够,请查看http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/Externalizable.html。 - Georgy Bolyuba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接