SubByte vergleichen
-
Hallo zusammen,
ich habe ein Byte[16] und würde gerne prüfen, ob die ersten 3 Byte gleich "sMI" sind. Wie mache ich das? Gibt es sowas wie
// BEGIN PSEUDOCODE BYTE output[16]; ... if ( output.subByte( 0,3 ) == "sMI" )) ... // ENDE PSEUDOCODEwohl eher nicht, aber wie kann ich das trotzdem lösen?
grüße Nils
-
Versuch's mal mit memcmp():
if(memcmp(output,"sMI",3)==0) ...(oder noch besser wäre es, du nutzt die Möglichkeiten von C++ - std::string hat eine Methode substr(), um Teile auszuschneiden)
-
Ok vielen Dank,
aber irgendwie klappt das noch nicht so ganz, liegt aber höchstwahrscheinlich an mir und meinem c++ wissen

void usbInterface_LPC2148::methodSwitchLEDOn( int LEDNr ) { BYTE datagram[16]; datagram[0] = 0; datagram[1] = (int)"s"; datagram[2] = (int)"M"; datagram[3] = (int)"I"; usbInterface::write( datagram ); }also so rufe ich meine Funktion auf, jetzt würde ich gerne im write prüfen ob die ersten 4 Zeichen ein 0sMI sind.
unsigned long usbInterface::write( BYTE* output ) { if ( memcmp(output, "0sMI", 4) == 0 ) { return 0; } ...und so versuch ich das zu prüfen, aber leider gibt er mir nicht 0 zurück, woran kann das denn liegen?
PS: Wenn jemand noch nen Tipp hat, wie ich das zuweisen der Byte s,M,I einfacher machen kann, dann bin ich auch dankbar.
-
Hm, jetzt müßte man wissen was für ein Typ BYTE ist. Den gibst im Standard nämlich nicht. Ich gehe mal davon aus, daß das ein typedef für ein char ist. In diesem Fall würde die korrekte Belegung der Bytes 1-3 z.B. so aussehen:
BYTE datagram[16]; datagram[0] = 0; datagram[1] = 's'; datagram[2] = 'M'; datagram[3] = 'I';Deine Version kann definitv nicht funktionieren (du schreibst Pointer in deine Variablen rein, die dann auch noch auf ein BYTE verkürtzt werden).
-
Ok, also ein char isses nicht
Error 4 error C2440: '=' : cannot convert from 'const char [2]' to 'BYTE'zumindest, wenn ich die Fehlermeldung richtig interpretier. Aber wirklich schlauer bin ich leider immer noch nicht. Aber wieso sagt er const char[2] wo kommt denn die 2 her?
Ein weiterer Fehler müsste doch auch noch in dem Vergleich sein, da müsste ich ja nicht die char 0 reinschreiben, sondern die Byte 0, aber wie mache ich das

-
Lern doch erstmal gescheid C++ bevor du sowas machst... Das ganz muss wie oben bereits gesagt in einfach Anführungszeichen!
-
na danke für deine nette und zuvorkommende art.
ich lass mich aber trotzdem nicht unter kriegen
Wenn ich mir im Speicher jetzt die Adresse auf die der output Zeiger zeigt anschau, dann steht da jetzt .sMI drin, was ja schonmal ganz gut ist
wie würde ich denn jetzt auf diesen "." in meinem memcmp vergleichen ?
-
Habs jetzt einfach mal so gemacht und es klappt.
BYTE method[4]; method[0] = 0; method[1] = 's'; method[2] = 'M'; method[3] = 'I'; if ( memcmp(output, method, 4) == 0 ) { return 0; }ist bestimmt nicht schön, aber reicht für einen der nicht "gescheid" c++ kann

-
Du hast als erstes Zeichen in deinem String eine 0 eingetragen, das ist etwas anderes als '0' (das Zeichen hat den ASCII-Wert 48). Um das in den String einzufügen, mußt du Escape-Sequenzen verwenden:
BYTE datagram[16]; datagram[0] = 0; datagram[1] = 's'; datagram[2] = 'M'; datagram[3] = 'I'; ... if ( memcmp(output, "\0sMI", 4) == 0 ) ...
-
cool, danke. hat wunderbar geklappt. gibt es noch ne schönere version dem datagramm ne "sMI" an den Anfang zu stellen?
-
memcpy(), strcpy() und Kollegen. Oder du verwendest std::basic_string<BYTE> - der ist wesentlich einfacher zu handhaben.
-
String wäre wohl das beste, aber leider muss die Funktion dann auch noch auf einem embedded system unter c funktionieren, aber das geht jetzt so schon.
-
Probier's doch einfach aus. Wenn's nicht geht - schau dir mal das da an.