OldSchoolHack

Register / Login English

c++/java problem


icon c++/java problem #1

Join Date: Sep 2010

Posts: 38

Hi ho OSH community,
ich entwickle gerade zwei Programme, die mit einander kommunizieren,
eines in c++, eines in java.

Der Datenverkehr wird verschlüsselt. Am anfang jedes Pakets steht die Länge des Paketes, diese ist nichr verschlüsselt:

Das andere Programm ließt die Größe(4 Bytes) ein und anschließend das verschlüsselte Paket.

Die Pakete bestehen im Quellcode aus byte/char-Arrays.
In c schreibe ich die größe mittels memcpy in das array:
CPP Code:
  1.  
  2. memcpy(data,&size,sizeof(int));
  3.  
Am ende kommt
TEXT Code:
  1. 12.0.0.0.65.-14.-12.-38.-28.68.2.85.-15.32.-78.-63.
  2.  
raus, die man sieht ist das ganze paket 16 Bytes lang, im Header stehen halt nur 12, so sollte es auch sein.


In Java funktioniert das nicht ganz so gut, dort arbeitet man nicht mit pointern, kann keinen speicher direkt kopieren.
Um dort pakete zu bauen, verwende ich die Klasse:
CPP Code:
  1.  
  2. ByteBuffer buffer = ByteBuffer.allocate(size);
Mit der .putInt Methode schiebe ich einen Integerwert von vorne in das Array.
Raus kommt am ende sowas hier:
TEXT Code:
  1. 0.0.0.12.64.-14.-9.50.-26.68.2.87.-14.32.-78.-62.
  2.  
Auch hier stehen im Header 12 Bytes, alles richtig.

Allerdings erkennt man nun das Problem, der ByteBuffer interpretiert den Integerwert 12 = 0.0.0.12

Beim kopieren in c hingegen 12 = 12.0.0.0

Da beide Programme kommunizieren, würde ich mich gerne für eine der beiden Methoden entscheiden,
problem, ich weiß nicht, warum sie unterschiedlich sind und ich weiß nicht, wie ich die jeweils andere Methoden in der anderen Sprache "schön" implementieren soll.

natürlich könnte ich die Bytes einfach vertauschen, aber das scheint mir nicht wirklich effizient.

Vlt hat ja wer nen Denkanstoß für mich =$

Lg Alex


icon #2

Join Date: Jan 2009

Posts: 454

User-Rating:

10 positive
0 negative
*wirft mal http://de.wikipedia.org/wiki/Byte-Reihenfolge in den Raum, weiß aber nicht ob das was damit zu tun hat ._.*

__________________

Quote

[16:44:40] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has joined #Oldschoolhack
[16:44:47] <Cycode> ich könnt so abreiern ey echt..
[16:44:58] <sMp> oh neine
[16:45:07] <sMp> wenn ich sowas schon höre
[16:45:11] <sMp> instaleave
[16:45:14] * sMp (sMp[at]osh-B065CA09.pools.arcor-ip.net) has left #Oldschoolhack
icon #3

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
ja, das liegt dadran dass Java/C# BigEndian benutzt und C++ LittleEndian

ich hab mir für C++ das hier geschrieben:
CPP Code:
  1. template <typename T>
  2. static T HostToNetworkOrder(T value)
  3. {
  4. int size = sizeof(T);
  5. char *bytes = reinterpret_cast<char*>(&value);
  6. for (int i = 0; i < size / 2; ++i)
  7. {
  8. char temp = bytes[i];
  9. bytes[i] = bytes[size - i - 1];
  10. bytes[size - i - 1] = temp;
  11. }
  12. return value;
  13. }
  14.  
  15. template <typename T>
  16. static T NetworkToHostOrder(T value)
  17. {
  18. return HostToNetworkOrder(value);
  19. }

Das musst du aber nur bei short, int, long machen. Floats sind standardisiert.

greetz KN4CK3R

__________________

Hallo
icon #4

Join Date: Sep 2010

Posts: 38

Herzlichen Dank knacker,
genau so habe ich es momentan auch gelöst, ich swappe alle Bytes (allerdings ein wenig unschöner, ohne ginerische datentypen).

ich dachte eigentlich, dass BigEndian und LittleEndian Systembedingt sind,
allerding ist die JVM ja eig auch ein System.

Float wird mittels IEEE Standart dargestellt, wenn ich mich nicht irre.
icon #5

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
ja, ist systemabhängig. Mit "für C++" meinte ich "für C++ auf Windowssystemen". Generell sollte man übers Netzwerk nur die NetworkByteOrder benutzen, damit es immer einheitlich ist. Java und C# benutzen systemunabhängig BigEndian.
Float und Double stehen in irgendnem IEEE Dokument.

greetz KN4CK3R

__________________

Hallo