Ich kann Dir nicht ganz folgen. Warum machst du das so kompliziert?
Du kannst doch einfach mit einer Schleife durch deinen Buffer gehen und immer wenn der Wert ungleich dem vorherigen ist, dann rufst du deine Methode auf.
Und warum wandelst du die Werte in Float? Das kostet doch nur Zeit und bringt gar nichts?
Java:
int value=bb.getInt();for(int i=1; i<97; i++){int newValue=bb.getInt();if(newValue!=value)tueWas();
value=newValue;}
Da hast du mich falsch verstanden oder ich habe es undeutlich geschrieben:
Ich bekomme alle 5 Sekunden einen 97 Byte langen Wert.
Darin sind Zählerinformationen, die ich lesen muss.
Ich muss also den Wert von vor 5 Sek auf änderung prüfen und nicht die Werte innerhalb des ByteBuffers.
Das Umrechnen ist nötig, da die Daten über Modbus gesendet werden und ich den Rohwert erst konvertieren muss.
Das Umrechnen macht in meinen Augen aber immer noch keinen Sinn. Wen du ein getInt() in ein Float änderst bleibt das Ergebnis immer noch ein int. Das ist einfach Sinnfrei.
Und wenn du den Bluffer vergleichen willst, dann brquchstcdu ja auch zwei Buffet. Du hast aber nur einen in deinem Beispiel. Wo kommt denn der zweite her?
ich stimme Claus zu: Einlesen eines 4 byte int Wert, Konvertieren in einen 4 Byte float und dann einem 8 byte double zuweisen, sieht komisch aus. Ausserdem muss man beim Vergleichen von Fliesskommazahlen aufpassen.
Abgesehen davon: wie wäre es mit so einer Struktur:
Java:
int[] phaseVoltages =newint[100];AnInterface[] methods =AnInterface[100];//dann alle 5 Sekundenfor(int i =0; i <100; i++){int current = bb.getInt;if(phaseVoltages[i]!= current){
phaseVoltages[i]= current;
methods[i].valueChanged);}}
AnInterface wäre dann so etwas wie Methode.xy in deinem obersten Post. Die Methode valueChanged() müsste dann jeeils so implemntiert werden, wie deine bereits vorhandenen Methoden.
Das klappt aber nur, wenn die ganzen Methoden, die du bei einer Wertänderung aufrufst, sich tatsächlich in einem Interface abbilden lassen, also z. B. einen ähnlichen oder gar identischen Satz an Parametern haben.
Dann kannst du (wie bereits angeraten) auf die Wandlung nach Float verzichten und einfach prüfen, ob sich das neue Bitmuster vom alten unterscheidet (und es nur dann anschließend in einen Float wandeln).
Wie viel Latenz ist denn erlaubt? Also: Wie schnell nach dem Eintreffen neuer Daten muss dein Programm das mitbekommen? Da nur alle 5 Sekunden neue Werte eintreffen, vermute ich mal, dass 1/10 s kein Problem ist - du kannst also zwischen zwei Abfragen 1/10 s warten:
Vielen Dank für die konstruktiven Vorschläge. Genau dies habe ich gesucht.
Jedoch zuerst:
Ich erhalte als ByteBuffer ein Bitmuster das ich in einen Doublewert am ende wandeln muss. Also nicht "nur" float to double.
Nachzulesen hier: IEEE 754
Ich nutze ja die intBitsToFloat Methode.
Aber arilou hat eine gute Idee. Ich kann ja das Bitmuster gespeichert lassen und bei einem neuem zuerst die Bitmuster auf Änderung prüfen. So muss ich nur konvertieren, wenn sich der Wert geändert hat.
Die CRC Abfrage kommt noch in eine eigene Methode.
Die ByteBuffer werden abwechselnd beschrieben und die Bitmuster verglichen. So muss ich nicht ein altes nicht in ein neues ByteArray kopieren und Zeit verschwenden.