2016-03-19 11 views
3

Ich erhalte einige numerische Daten von einem Java-Client über Socket-Verbindung auf C++ Server. Wenn ich 4-Byte-Int-Typ Daten erhalte, was ich brauche, ist nur mit Ntohl() -Funktion oder umgekehrt die Bit-Reihenfolge in C++ Int-Typ zu konvertieren. Allerdings habe ich Probleme, lange Datentypen aus Java zu konvertieren. Egal was ich versuchte, ich konnte den korrekten Wert nicht wiederherstellen. Ich habe auch LONG64, ULONG64 und int64_t verwendet, und keiner von ihnen hat funktioniert.Konvertieren von Java in Int64 in C++

Zum Beispiel, wenn ich lange s = 1 aus Java, auf C++ Seite Ich habe an:

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 

wenn ich

size = ntohl(size) 

Dann Größe wird sich 0 unabhängig von der ursprünglichen long-Wert ist in Java!

Wenn ich nicht ntohl() Umwandlung tun, dann size = 72057594037927936 für s = 1

Ich habe gefunden, kaum nützliche Informationen zu diesem Thema und ich würde jeden Vorschlag zu schätzen wissen.

+0

Nur zur Klarheit, auf welcher Architektur ist ein 4-Byte-Int-Typ Daten besetzt * 64 Bit *? Zuletzt habe ich überprüft, ** 4 ** Bytes sind fast immer 4 Oktetts = ** 32 ** Bits. Du weißt, du könntest immer (a) sie in ein 'int8_tar [n] 'lesen und tatsächlich die Anzahl der gelesenen Bytes überprüfen und bestätigen, wo sie sich in der Sequenz befinden. Die Überprüfung des Rückgabeergebnisses von 'recv' konnte ebenfalls nicht schaden. – WhozCraig

+0

Java, im Gegensatz zu C und C++ zum Beispiel, kümmert sich nicht um Endianess; Es wird immer Big Endian sein. Ist das nicht die Ursache Ihres Problems? – fge

+0

Vielen Dank für Ihre Vorschläge. Wie von Rob in der Antwort gesagt, ist das Problem auf ntohl() -Funktion selbst, es arbeitet auf 32-Bit-Daten. –

Antwort

2

Der Wert 72057594037927936 ist 0x0100000000000000 in Hex. Wie Sie vielleicht vermutet haben, ist das einfach Rückwärts-Byte-Reihenfolge, die 1 ist vorne statt zurück.

ntohl() ist 32-Bit, so dass es die oberen vier Bytes (die ersten 8 Hexadezimalziffern) auswirft, geben Sie Null. Sie könnten stattdessen htonll verwenden, aber das ist nicht ganz richtig. Am besten ist es, die Reihenfolge der Bytes selbst umzukehren.

int64_t size; 
recv(client, (char *)&size, sizeof int64_t, 0); 
char *start = (char *)&size, *end = start + sizeof(size); 
std::reverse(start, end); 

Es gibt eine Tonne von Möglichkeiten, das Bytes umgekehrt, und eine Tonne Weisen im Allgemeinen mit wenig/Big Endian Problemen beschäftigen.

+0

Klar und unkompliziert. Vielen Dank, mein Herr! –