2010-07-09 25 views
15

¿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) 
+0

¿Hay una respuesta aceptada para esta pregunta? – Xofo

+0

No es el equivalente exacto del paquete de Python, pero tal vez te ayude de todos modos: https://github.com/marc-christian-schulze/structs4java –

Respuesta

1

entidad más cercana en el núcleo de Java es Serialization. Convierte objeto en secuencia de bytes y viceversa.

+0

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

+0

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 –

8

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

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

+0

@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

+0

@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. –

3

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

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

1

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