strlen Probleme



  • Hallo.

    Ich habe in einem String mehrere Hex-Commandos gespeichert.
    Nun möchte ich die Länge des Strings bestimmen (ja ich weiss mit strlen soll das gehen) und diesen Wert als als Hex-Wert in einem neuen String zusammen mit den Hex-Commandos schreiben.

    Beispiel:
    Stringalt = 0x60, 0x05, 0x 00, 0x01, \n
    Stringlänge = 4
    --> Stringneu = 0x04, 0x60, 0x05, 0x00, 0x01, \n

    Da ich diese Strings durch verschiedene Funktionen jonglieren möchte, wäre es recht mühselig jedesmal das in ein Char-Array zu wandeln und dann wieder zurück in Strings.
    Hat jemand ne Idee?

    Btw:

    int iBytecount=strlen(CommandIn);
    

    Warum steht da hinterher nix drin?
    Bzw. strlen gibt glaube ich size_t zurück. Wie wandel ich das in int?
    Danke.



  • Mackie1980 schrieb:

    ...
    Ich habe in einem String mehrere Hex-Commandos gespeichert.
    Nun möchte ich die Länge des Strings bestimmen (ja ich weiss mit strlen soll das gehen)...

    Nein. Geht nicht !
    Du musst Dir die Länge explizit merken.
    Kannst aber auch std::string nehmen, der macht das für Dich.

    Gruß,

    Simon2.



  • Die Dinger solltest du evtl. besser garnicht als wirkliche Strings benutzen. Denn in deinem Stringinhalt sehe ich z.B. ein 0x00 und wenn cih net ganz irre ist das das Terminierungszeichen fuer C-Strings. Was hindert dich, einfach ein char array zu nutzen? Die Laenge rausfinden kannst du im allgemeinen nur, wenn du sie speicherst, da strlen afaik nur nach der Nullterminierung sucht.

    k



  • Hallo Simon.
    Superschnelle Antwort. Danke.

    Genaugenommen verwende ich CString.
    Jetzt ist es so, dass sich diese Commandos in anderen Funktionen zusammensetze
    und diese unterschiedliche Länge haben können. Deswegen muss ich die Länge bestimmen können. Muss ich dann doch über den Umweg gehen, dass in ein Char-Array zu kopieren?



  • Hallo Pumuckl.
    Das einzige was mich daran hindert Char-Arrays zu nutzen ist, dass ich keine Ahnung habe wie ich diese verschiedenen Funktionen übergebe und ob das überhaupt geht?!



  • Mackie1980 schrieb:

    ...Deswegen muss ich die Länge bestimmen können. Muss ich dann doch über den Umweg gehen, dass in ein Char-Array zu kopieren?

    Letzteres wird Dir auch nicht helfen, wenn Du nicht die Länge kennst.
    Es ist einfach so, dass Länge und Inhalt unabhängige Größen sind. Bei C-Strings hat man eine Kopplung mit einem "ungültigen Wert" gefunden, das als "Ende-Kennzeichen" verwendet wird.

    Wenn aber Deine Daten JEDEN Wert annehmen dürfen, geht das nicht mehr.

    Also entweder musst Du die Länge der Daten explizit bekommen (was ich immer bevorzuge) oder anhand von fachlichen Kritierien entscheiden, wann Schluss ist.

    z.B. ein eigenes "Endekennzeichen" (muss aber 100%ig zuverlässig sein; außerdem arbeiteen die ganzen C-String-Funktionen nicht damit) oder eine "innere Struktur" wie sie z.B. bei vielen technischen Protokollen (wo implizit Längenangaben mitgegeben werden) verwendet wird.

    Aber in jedem Fall musst Du dieses Wissen selbst einbauen.

    Gruß,

    Simon2.



  • Der "Trick" ist, dass ein Array, das an eine Funktion uebergeben wird, in einen Pointer auf sein erstes Element umgewandelt wird. Andererseits kann man mit dem Indexoperator, angewendet auf Pointer, auf die Plaetze "hinter" dem Pointer zugreifen (vorausgesetzt, man darf das, sprich der Speicher dahinter gehoert dir.

    In C-Routinen kommt sowas haeufig vor:

    void dosomething(char* ptr, int len)
    {
      for (int i =0; i < len; i++)
        ptr[i] = 'g';
    }
    
    int main()
    {
      char arr[10];   
      dosomething(arr, 7);
    }
    

    Hier wird mittels dosomething() ei 'g' in die ersten 7 bytes des arrays arr geschrieben 🙂

    Bei dir ginge das in etwa wie folgt:

    void tuwas(char* befehle, int laenge)
    { 
      //hier deine Verarbeitung
    }
    
    int main()
    {
      char foo[5] = {0x60[url], 0x05, 0x00, 0x01, '\n'[/url]}; //die Laenge ist uebrigens 5 nicht 4!
      int length = 4;
    
      tuwas(foo, 4);
    }
    

    Du kannst natuerlich statt die Laenge als eigenen Parameter anzugeben, sie in den ersten arrayindex schreiben:

    char foo[6] = {4, 0x60, 0x05, 0x 00, 0x01, \n };
    

Anmelden zum Antworten