Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java与Python的等价物';s struct.pack?_Java_Python_Struct_Pack - Fatal编程技术网

Java与Python的等价物';s struct.pack?

Java与Python的等价物';s struct.pack?,java,python,struct,pack,Java,Python,Struct,Pack,Java中是否有任何与Python的struct.pack等效的函数允许我像这样打包和解包值 pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512) 核心Java中最接近的特性是。它将对象转换为字节序列并返回 我想你想要的是: 大概是这样的: final ByteArrayOutputStream data = new ByteArrayOutputStream(); final DataOutputStream stream = new DataO

Java中是否有任何与Python的
struct.pack
等效的函数允许我像这样打包和解包值

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

核心Java中最接近的特性是。它将对象转换为字节序列并返回

我想你想要的是:

大概是这样的:

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();

我开始开发非常接近Python结构的项目: 在JBBP中,它看起来像

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

真不敢相信你。尽管我不喜欢Java,但应该有比序列化更接近这种能力的东西:序列化不提供对创建实际字节的控制—它只允许您使用这些字节重新创建同一对象。默认情况下,它不提供控制,但您始终可以自定义它。提示:在我提供链接的页面上搜索readObject/writeObject。如果这还不够,请检查ByteBuffer不允许您写入字符串,并且承包商要求缓冲区大小限制-您需要预先决定输入的长度。@Yonatan,它允许您写入字符串:
buf.put(s.getBytes())
ByteBuffer
要求您在最初分配缓冲区时指定容量。你是说这是好事还是坏事?@SimonC ByteBuffer确实允许你以所展示的方式编写两个字符串。但是,s.getBytes()将从字符串返回UTF-8编码的字节数组(长度仍然可变)。它不会有尾随的零。除此之外,buf.put()使用ByteBuffer中的当前位置。这可能不是您想要的。DataOutputStream仅适用于java原语。ObjectOutputStream(它还实现了DataOutput接口)使您能够编写原语和可序列化对象。对于这个问题有没有公认的答案?它与Python的软件包并不完全相同,但可能对您有所帮助:
JBBPOut.BeginBin().Int(0,0).Short(21,96).Int(512).End().toByteArray();