2016-06-03 15 views
1

Ich versuche, mein C++ - Projekt in Java zu portieren. Nach der Zeile muss ich einige Bytes von der seriellen Schnittstelle lesen und zwei Bytes zu kurz kombinieren. Die Dinge arbeiten elegant mit unter dem Code.Kombinieren Sie zwei Bytes (ein positives und ein anderes negatives) zu kurz in Java

   ByteBuffer bb = ByteBuffer.allocate(2); 
       bb.order(ByteOrder.LITTLE_ENDIAN); 

       bb.put(b1); 
       bb.put(b2); 
        result = bb.getShort(0); 

In C++ Projekt statt kurz haben sie unsigned kurz (in Java haben wir nicht vorzeichenlos).

So my above logic result does not align with C++ result for below case:- 
b1 = 106 , b2 = -1  c++ result = 150 and java = -150 


b1 =-6, b2 = -1  506 in VC++ but -6 in java 

However, if only first byte is negative then my result are similar : 
b1 = -12 , b2 = 1  c++ result = 500 and java = 500 

Ich möchte mein Ergebnis mit C++ ausrichten. Anregungen und Hilfe wären sehr willkommen.

+0

Was genau willst du? Ihr C++ kombiniert eindeutig NICHT zwei Bytes, aber das Java macht das richtig. Wir können nicht sagen, wie man das Java macht, wenn wir die C++ - Logik nicht kennen. – ElderBug

+0

@ElderBug in C++ sie sind zwei Bytes in unsigned Kurz kombinieren, aber in Java Short ist unterzeichnet ... ist das der Grund für diese Diskrepanz im Ergebnis? –

+1

Das C++ kombiniert NICHT zwei Bytes zu unsigned short. Zumindest nicht auf die offensichtliche Art und Weise. Es gibt eine Logik, die du nicht gezeigt hast. – ElderBug

Antwort

0

Verwenden Sie nicht getShort(), verwenden Sie stattdessen getInt().

Ihr Problem ist, dass das höchstwertige Bit als Vorzeichenbit interpretiert wird, da dies für einen signierten Kurzschluss der Fall ist. Wenn Sie den Datentyp so erweitern, dass das Bit nicht länger als Vorzeichenbit betrachtet wird, sollten Sie das gewünschte Verhalten erhalten.

Sie zu polstern Ihre Puffer benötigen, dies zu tun:

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.order(ByteOrder.LITTLE_ENDIAN); 

bb.put(b1); 
bb.put(b2); 
bb.put(0); 
bb.put(0); 

result = bb.getInt(0); 

EDIT: Diese würde Arbeit, wenn nur der C++ Code, um das Richtige zu tun, aber wie in den Kommentaren darauf hingewiesen, oben ist es nicht (dh es nimmt nicht einfach die zwei Bytes und kombiniert sie zu einem kurzen. Es führt auch einige andere Transformation auf ihnen).

+0

es gibt 65131 für {107, -2} .. erwartet wird 661 –

+0

Ich bekomme diese Ausnahme nicht. Sind Sie sicher, dass Sie den Code * genau * wie oben verwenden (einschließlich des Parameters '0' bis 'getInt'?) – Smeeheey

+0

entfernt diesen Kommentar, aber nicht erwartetes Ergebnis. –

0

java -6 (0xFFFA) ist korrekt, C++ 506 (0x01FA) ist nicht korrekt. 0xFA. Sieht so aus, als hättest du -1: 1 oder -1 vertippt.