Pytanie Odpowiednik Java Pythona do struct.pack?


Czy istnieje jakakolwiek funkcja równoważna do Pythona struct.pack w Javie, który pozwala mi spakować i rozpakować takie wartości?

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

16
2017-07-09 04:44


pochodzenie


Czy istnieje akceptowana odpowiedź na to pytanie? - Xofo
Nie jest to dokładny odpowiednik pakietu Pythona, ale może i tak ci pomoże: github.com/marc-christian-schulze/structs4java - Marc-Christian Schulze


Odpowiedzi:


Myślę, że możesz być po 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();

8
2017-07-09 05:39



ByteBuffer nie pozwala na zapisywanie napisów, a wykonawca wymaga ograniczenia wielkości bufora - musisz wcześniej ustalić, jak długo będzie to wprowadzane. - Yonatan
@ Yonatan, pozwala na pisanie ciągów: buf.put(s.getBytes()). ByteBuffer wymaga określenia pojemności podczas początkowego przydzielania bufora. Mówisz, że to dobra rzecz czy coś złego? - SimonC
@SimonC ByteBuffer pozwala ci napisać dwa ciągi w sposób, który pokazałeś. Jednak s.getBytes () zwróci tablicę bajtów kodowanych w UTF-8 z łańcucha (nadal zmienna długość). Nie będzie mieć końcowego zera. Poza tym buf.put () używa aktualnej pozycji w ByteBuffer. To może nie być dokładnie to, czego chcesz. - Peter Schaeffer


Coś takiego:

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

Później możesz odczytać te dane:

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

3
2017-08-23 13:42



DataOutputStream jest dobre tylko dla prymitywów java. ObjectOutputStream (który również implementuje interfejs DataOutput) umożliwia pisanie obiektów podstawowych i serializowalnych. - Yonatan


Najbliższa funkcja w podstawowej Java jest Serializacja. Konwertuje obiekt na sekwencję bajtów iz powrotem.


1
2017-07-09 04:57



Nie mogę ci uwierzyć. Nawet jeśli nie lubię Javy, powinno być coś, co jest bliższe możliwości robienia takich rzeczy niż serializacja: Serializacja nie daje kontroli nad tym, które bajty są tworzone - pozwala tylko na odtworzenie tego samego obiektu za pomocą tych bajtów. - jsbueno
Domyślnie nie daje żadnej kontroli, ale zawsze można go dostosować. Podpowiedź: wyszukaj parametr readObject / writeObject na stronie podałem Ci link. Jeśli to nie wystarczy, sprawdź download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/... - Georgy Bolyuba


Zacząłem rozwijać projekt, który jest bardzo zbliżony do Python Structures: java-binary-block-parser w JBBP będzie wyglądać

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

1
2017-07-07 05:29