Announcement

Collapse
No announcement yet.

Bestimmter String wird nicht gefunden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bestimmter String wird nicht gefunden

    Hallo Experten,

    bevor ich da jetzt noch Wochen grübel, hab ich beschlossen doch mal jemanden zu fragen, der sich mit sowas auskennt. Und das Google-Orakel liefert dazu ausnahmsweise auch keine befriedigenden Antworten.

    Also, ich will ein Bytearray nach einem String durchsuchen und mir die jeweilige Position zurückliefern lassen. Dafür hab ich folgende Methode geschrieben:

    Code:
    int CLeoEditor::findPos(String^ search, array<unsigned char>^ buffer)
    {
    	array<Char>^ seaToArr = search->ToCharArray();
    	/*array<unsigned char>^ seaToArr = gcnew array<unsigned char>(search->Length); 
    	for(int i=0; i<search->Length; i++){
    		seaToArr[i] = search[i];
    	}*/
    
    	for(int i=0; i < buffer->Length; i++)
    	{
    			if(buffer[i] == seaToArr[0]){
    				for(int j=0; j < seaToArr->Length; j++){
    					if(buffer[i++] == seaToArr[j]){
    						if(j == seaToArr->Length-1) return i;
    					}
    				}		
    		    }
    	}
    	return 0;	
    }
    Der auskommentierte Text war mal Testweise ob das was an der Sache ändert, aber das Ergebnis ist genau das Gleiche. Und zwar habe ich folgende Strings (u.a.) getestet, die sind auch ganz sicher jeweils nur einmal in der Textdatei vorhanden:

    String am Anfang (Zeile 6) der in den buffer eingelesenen Textdatei zum testen:
    "GarageDisplayFlags=" -> richtige Position

    Eigentlich gesuchter String in der Textdatei:
    "PhysicalModelFile=" ->nicht gefunden
    "PhysicalM" -> richtige Position
    "PhysicalMo" -> nicht gefunden
    "alModelFile=" -> falsche Position (vollkommen anderer Text wird gefunden)
    "calModelFile=" -> richtige Position
    "icalModelFile=" -> falsche Position
    "sicalModelFile="-> falsche Position

    String am Ende der Textdatei:
    "SlowReboundRange"-> falsche Position
    "SlowReboundRange=" -> falsche Position

    Letzte Zeile der Textdatei:
    "BrakeGlow"-> richtige Position
    "BrakeGlow="-> falsche Position

    Was soll das denn bitte???
    Wo muss ich den Fehler suchen, wenn mir das vielleicht einer sagen könnte...?

    Danke schonmal!
    Zuletzt editiert von stevie; 18.11.2010, 02:10.

  • #2
    Was soll das denn bitte???
    Was?

    Ich verstehe den Code nicht. Es gibt eine Schleife über den Buffer. Und dann kommt

    if(buffer[i] == seaToArr[0]){

    Wozu dient das?
    Dann folgt eine weitere Schleife?

    Vermutlich willst du das zeichenweise prüfen?

    Empfehle die Nutzung von memicmp. Dort wird gleich ab einer bstimmten Position der ganze gesuchte Ausdruck verglichen. Das zeichenweise Vergleichen entfällt.


    for(x=0;x<size;x++)
    {
    if(memicmp(buffer+x,suchwort,suchwortLänge)==0)
    {
    gefunden++;
    Christian

    Comment


    • #3
      Wozu dient das?
      Dann folgt eine weitere Schleife?

      Vermutlich willst du das zeichenweise prüfen?
      Genau, mit if(buffer[i] == seaToArr[0]) wird auf das erste Zeichen des Suchwortes geprüft, wenn das gefunden wurde, vergleiche ich die folgenden Zeichen im Buffer mit den restlichen Zeichen des Strings und wenn der Iterator j == seaToArr->Length-1 ist wurde der komplette String gefunden und i ist dann der Index nach dem letzten Zeichen des gesuchten Strings im Buffer. So hatte ich mir das jedenfalls gedacht.

      memicmp kann ich aber nicht innerhalb des .NET Framework benutzen, oder?

      Wenn ich schreib
      Code:
      for(int x=0;x<buffer->Length;x++)
      	{	
      		if(memicmp(&buffer+x, &search, search->Length)==0)
      		{
      			return x; 
      		}
      	}
      läuft das Programm zwar, aber bei memicmp(&buffer+x, &search, search->Length) bekomm ich eine "System.AccessViolationException" (Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.)

      Ok, dann halt mit der .NET Entsprechung:
      Code:
      String^ bufstring;
      	array<unsigned char>^ bufarr = gcnew array<unsigned char>(search->Length);
      
      
      for(int x=0;x<buffer->Length;x++)
      {	
      	Buffer::BlockCopy(buffer, x, bufarr, 0, search->Length);
          	bufstring = bufarr->ToString();
      	if(bufstring->Equals(search))return x;
      		
      	}
      Da bekomm ich dann bei bufstring = bufarr->ToString() eine "System.ArgumentException" (Zusätzliche Informationen: Offset und Länge für das Array liegen außerhalb des gültigen Bereichs, oder die Anzahl ist größer als die Anzahl der Elemente vom Index bis zum Ende der Quellauflistung.)
      Macht aber nix, buffarr->ToString() liefert mir eh nur den Typ als String (System.Byte[]), und ich konnte noch nicht rausfinden, wie ich den Inhalt als String bekomme. Hat jemand dazu nen Tip?

      Und deswegen hat ich mir halt so in meinem jugendlichen Leichtsinn gedacht, dass ich mir selber schneller was passendes geschrieben hab.

      Versteht mich nicht falsch, wenn mir hier eine einfachere, lauffähige Lösung
      aufgezeigt würde, würde ich gern was dazulernen. Aber im Moment find ich meinen ersten Ansatz eigentlich noch am einfachsten:

      Code:
      for(int i=0; i < buffer->Length; i++)
      	{
      			if(buffer[i] == search[0]){
      				for(int j=0; j < search->Length; j++){
      					if(buffer[i++] == search[j]){
      						if(j == search->Length-1) return i;
      					}
      				}		
      		    }
      	}
      	return 0;
      Das im ersten Post war genaugenommen schon zweit- und drittversuch. Und es funktioniert ja prinzipiell, aber eben leider nur bei manchen Strings und bei anderen wieder nicht. Und ich finde da halt auch kein Muster, wieso der eine String korrekt gefunden wird, und ein anderer wieder nicht (siehe Beispiele im ersten Post).

      Für meine Anwendung würde es eigentlich auch vollkommen ausreichen wenn ich z.B. die Position "PhysicalM" bestimmen kann.

      Aber mir gehts jetzt hauptsächlich darum, zu verstehen, wie sowas zustande kommen kann.

      Comment


      • #4
        memicmp kann ich aber nicht innerhalb des .NET Framework benutzen, oder?
        Wenn du unter C++ postest was sollen dann NET Fragen?

        Was nun NET oder C++?



        läuft das Programm zwar, aber bei memicmp(&buffer+x, &search, search->Length) bekomm ich eine "System.AccessViolationException" (Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.)
        Wahscheinlich deutet eine deiner Zeiger auf einen ungültigen Speicherbereich


        Und ich finde da halt auch kein Muster, wieso der eine String korrekt gefunden wird, und ein anderer wieder nicht (siehe Beispiele im ersten Post).
        ...

        Aber mir gehts jetzt hauptsächlich darum, zu verstehen, wie sowas zustande kommen kann.
        Liegt zu 99% meistens an der Programmierung. Abhilfe schafft hier das debuggen. Dann solltest du sehen was wann passiert
        Christian

        Comment


        • #5
          Wenn du unter C++ postest was sollen dann NET Fragen?

          Was nun NET oder C++?
          Ups, sorry, mein Fehler. Grad gesehen das es da nen eigenen Bereich für gibt.

          Liegt zu 99% meistens an der Programmierung. Abhilfe schafft hier das debuggen. Dann solltest du sehen was wann passiert
          Ok, nehm ich mal so hin.

          Hast mich eh schon auf die "richtige" Lösung gebracht, danke dafür:
          Code:
          String^ bufstring;
          array<unsigned char>^ bufarr = gcnew array<unsigned char>(search->Length);
          System::Text::ASCIIEncoding asciiEncoder;
          for(int x=0;x<buffer->Length;x++)
          {	
          	Buffer::BlockCopy(buffer, x, bufarr, 0, search->Length);
              	bufstring = asciiEncoder.GetString(bufarr, 0, search->Length);
          	if(bufstring->Equals(search))return x;
          		
          }
          return 0;
          Zuletzt editiert von stevie; 18.11.2010, 21:23.

          Comment

          Working...
          X