2009-08-17 16 views
1

Hier ist mein Szenario. Ich habe eine Anwendung geschrieben in C++, aber nicht die komplette Quelle, aber das "Fleisch" davon ist da. Ich habe auch eine kompilierte exe dieser Anwendung. Es kommuniziert mit einem Server irgendwo hier in unserem Netzwerk. Ich versuche, den C++ - Code in Java zu replizieren, aber es verwendet dwords und Speicherreferenzen, sizeof usw., alles Dinge, die es in Java nicht gibt, da es seinen eigenen Speicher verwaltet. Es erstellt diese große komplexe Nachricht und sendet sie dann über das Netzwerk. Also schnüffle ich im Grunde den Verkehr und inspiziere das Paket und versuche, die Daten, die es sendet, hart zu codieren, um zu sehen, ob ich auf diese Weise eine Antwort vom Server bekommen kann. Allerdings kann ich die Nachricht nicht perfekt reproduzieren. Einige davon, wie der Lizenzcode, der gesendet wird, ist in "clear hex", dh hex, das in ascii übersetzt wird, wobei einige andere Teile der Daten nicht "clear hex" sind, wie "aa", was nicht der Fall ist übersetzt in ascii (oder zumindest einen gemeinsamen Zeichensatz ?? wenn das irgendeinen Sinn macht, bin ich mir nicht sicher).CPP zu Java Konvertierung

Idealerweise möchte ich es nicht so machen, aber es ist ein Sprungbrett, um zu sehen, ob der Server auf mich reagieren kann. Eine der Funktionen ist, dass sich die Anwendung selbst registriert und das ist die, die ich zu replizieren versuche.

Einige meiner obigen Annahmen können falsch sein, also entschuldige ich mich im Voraus. Vielen Dank für Ihre Zeit.

Antwort

2

In Java sind alle "Zeichen" -Daten als Unicode (und nicht als ASCII) codiert. Wenn Sie also mit etwas außerhalb sprechen, müssen Sie die internen Strings der Außenwelt zuordnen. Es gibt mehrere Möglichkeiten, dies zu tun:

  1. Verwenden Sie eine ByteArrayOutputStream. Dies ist im Grunde ein wachsender Puffer von Bytes, an die Sie anhängen können. Auf diese Weise können Sie die Nachricht mithilfe von Bytes erstellen.

  2. Verwenden Sie getBytes(encoding) wo Codierung ist die Codierung der anderen Seite versteht. In Ihrem Fall wäre das "ASCII" für die Textteile.

In Ihrem Fall benötigen Sie wahrscheinlich beide. Erstellen Sie einen Byte-Puffer, fügen Sie Strings und Bytes hinzu und senden Sie das Endergebnis (getByteArray()) über die Socket-API.

+0

Hey danke, das schien gut zu funktionieren. Alternativ, als ich auf eine Antwort wartete, konnte ich ein Zeichenarray erstellen und Sie können Zeichen mit 0x darstellen ?? woher ?? kann ein beliebiger hex-Wert sein, also konnte ich hier "aa" verwenden und es den Wert darstellen, den ich zu replizieren versuchte. Ihre Antwort ist jedoch aus einem lesbaren/programmatischen Ansatz offensichtlich angemessener. Vielen Dank. – ckelner

+0

In Java "char"! = "Byte" (anders als in C). Du könntest ein byte [] -Array erstellen, aber dann musst du dich um die aktuelle Position usw. kümmern. Viel Ärger. –