¿Hay alguna función equivalente a la de Python struct.pack
en Java que me permita empaquetar y descomprimir valores como este?equivalente en Java de struct.pack de Python?
pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512)
¿Hay alguna función equivalente a la de Python struct.pack
en Java que me permita empaquetar y descomprimir valores como este?equivalente en Java de struct.pack de Python?
pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512)
entidad más cercana en el núcleo de Java es Serialization. Convierte objeto en secuencia de bytes y viceversa.
No puedo creerlo. Aunque no me gusta Java, debe haber algo más cerca de poder hacer cosas como esta que la serialización: la serialización no le da control sobre qué bytes se están creando, solo le permite recrear el mismo objeto con esos bytes. – jsbueno
Por defecto no le da control, pero siempre puede personalizarlo. Sugerencia: busque readObject/writeObject en la página a la que le di un enlace. Si eso no es suficiente, consulte http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/Externalizable.html –
Creo que lo que es posible que después de un 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 no le permite escribir cadenas, y el contratista requiere una limitación de tamaño del búfer, es necesario que decida por adelantado cuánto tiempo será su entrada. – Yonatan
@Yonatan, te permite escribir cadenas: 'buf.put (s.getBytes())'. 'ByteBuffer' requiere que especifique la capacidad cuando se asigna inicialmente el búfer. ¿Estás diciendo que esto es algo bueno o malo? – SimonC
@SimonC ByteBuffer le permite dos cadenas de escritura de la manera que ha mostrado. Sin embargo, s.getBytes() devolverá una matriz de bytes codificada UTF-8 de la cadena (aún longitud variable). No tendrá un cero final. Más allá de eso buf.put() usa la posición actual en ByteBuffer. Esto puede no ser exactamente lo que quieres. –
Algo como esto:
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
Más tarde, se puede leer que los datos:
final DataInputStream stream = new DataInputStream(
new ByteArrayInputStream(bytes)
);
final String user = stream.readUTF();
final String password = stream.readUTF();
DataOutputStream es bueno solo para las primitivas Java. ObjectOutputStream (que también implementa la interfaz DataOutput) le da la capacidad de escribir primitivas y objetos serializables. – Yonatan
Empecé desarrollo del proyecto que está muy cerca de Python Struct: java-binary-block-parser en JBBP se verá como
JBBPOut.BeginBin().Int(0,0).Short(21,96).Int(512).End().toByteArray();
¿Hay una respuesta aceptada para esta pregunta? – Xofo
No es el equivalente exacto del paquete de Python, pero tal vez te ayude de todos modos: https://github.com/marc-christian-schulze/structs4java –