2010-07-09 12 views
15

Esiste qualche funzione equivalente a Python struct.pack in Java che mi consente di comprimere e decomprimere valori come questo?Equivalente Java del struct.pack di Python?

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

Esiste una risposta accettata per questa domanda? – Xofo

+0

Non è l'equivalente esatto del pacchetto di Python ma forse ti aiuta comunque: https://github.com/marc-christian-schulze/structs4java –

risposta

1

caratteristica più vicino a nucleo Java è Serialization. Converte oggetto in sequenza di byte e viceversa.

+0

Non posso crederti. Anche se non mi piace Java, ci dovrebbe essere qualcosa di più vicino a essere in grado di fare cose come questa di serializzazione: la serializzazione non ti dà alcun controllo su quali byte effettivi vengono creati - ti permette semplicemente di ricreare lo stesso oggetto con quei byte. – jsbueno

+0

Per impostazione predefinita non ti dà alcun controllo, ma puoi sempre personalizzarlo. Suggerimento: cerca readObject/writeObject nella pagina a cui ti ho dato un link. Se ciò non è sufficiente, controlla http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/Externalizable.html –

8

Penso che ciò che si può essere dopo 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 non ti consente di scrivere stringhe, e l'appaltatore richiede una limitazione della dimensione del buffer - è necessario pre-decidere quanto a lungo il vostro input sarebbe. – Yonatan

+0

@ Yonatan, consente di scrivere stringhe: 'buf.put (s.getBytes())'. 'ByteBuffer' richiede di specificare la capacità quando si assegna inizialmente il buffer. Stai dicendo che questa è una cosa buona o cattiva? – SimonC

+0

@SimonC ByteBuffer ti consente di scrivere due stringhe come hai mostrato. Tuttavia, s.getBytes() restituirà una matrice di byte codificata UTF-8 dalla stringa (ancora variabile di lunghezza). Non avrà uno zero finale. Oltre a ciò, buf.put() usa la posizione corrente in ByteBuffer. Questo potrebbe non essere esattamente quello che vuoi. –

3

Qualcosa di simile a questo:

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 

In seguito, è possibile leggere i dati:

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

DataOutputStream è valido solo per le primitive java. ObjectOutputStream (che implementa anche l'interfaccia DataOutput) ti dà la possibilità di scrivere primitive e oggetti serializzabili. – Yonatan

1

ho iniziato sviluppo del progetto che è molto vicino a Python Struct: java-binary-block-parser in JBBP sarà simile a

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