String in bytearray



  • Ich brauche Hilfe um einen String in ein Bytearray umzuwandeln oder am besten ein WORD in 2 BYTES umwandeln.

    Ich habe ein Ansistring von den ich aber den Wert jedes einzelnen Bytes brauch, da jeder Buchstabe in Ansistring aber aus 2 Bytes besteht komme ich nicht weiter.

    Bis jetzt habe ich folgenden Code:

    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
    
    {
      Memo1->Lines->Add("Server ClientRead from"+Socket->RemoteHost+":"+String(Socket->RemotePort));
      String s="";
      String r="";
      char hexvaluestring[11]="";
      s=Socket->ReceiveText();
      for(int i=1;i<=s.Length();i++){
    	strcpy(hexvaluestring,"");
    	sprintf(hexvaluestring,"%02x",s[i]);
    	r+=String(hexvaluestring);
    	r+=" ";
      }
      Memo2->Lines->Add(r);
      ClientSocket1->Socket->SendText(s);
    }
    

    Aber wie gesagt ich brauche die eizelnen Bytes aus den Ansistring der mir über
    s=Socket->ReceiveText(); gegeben wird.

    Vielen dank im voraus.

    mfg Eles


  • Mod

    Ich bin mir nicht so ganz sicher, ob ich dich richtig verstanden habe. Sag mal was dazu:

    #include <string>
    #include <sstream>
    #include <iterator>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    string as_bytes(const string& input)
    {
      stringstream output;
    
      output<<hex;
      ostream_iterator<int> out_it (output," ");
      copy (input.begin(), input.end(), out_it );
    
      return output.str();
    }
    
    int main()
    {
      string test="Hallo Welt!";
      cout << as_bytes(test) << endl;  
    }
    


  • Naja fast 🙂

    Also ich habe sozusagen ein WORD, brauche dieses WORD aber in 2 BYTEs.



  • Byte01 = static_cast<BYTE>(DeinWord);
    Byte02 = static_cast<BYTE>(DeinWord >> (sizeof(Byte02) * 8));
    


  • Die erste Zeile:

    Byte01 = static_cast<BYTE>(DeinWord);
    

    funktioniert genau wie ich es mir vorgestellt habe

    Nur bei der zweiten Zeile:

    Byte02 = static_cast<BYTE>(DeinWord >> (sizeof(Byte02) * 8);
    

    bring mein Compiler (RAD Studio XE) eine kleine Fehlermeldung:

    [BCC32 Fehler] Unit1.cpp(60): E2293 ) erwartet

    und markiert die beiden ">>" in der zweiten Zeile.



  • Peinlich. Ich habe eine Klammer vergessen. Ich habe den Code schon überarbeitet.



  • Ausgezeichnet!

    Vielen dank, funktioniert super!

    Wie bekomme ich jetzt diese 2 Bytes wieder zu ein Word?



  • DeinWord = Byte02;
    DeinWord <<= sizeof(Byte02);
    DeinWord |= Byte01;
    


  • Super, vielen dank, wiedermal etwas dazu gelernt 🙂



  • std::uint16_t word = (static_cast<std::uint16_t>(Byte02) << 16) | Byte01;
    


  • Eine Frage noch, wie bekommen ich ein ByteArray[1024] mit also 1024 Elementen in ein DWORD und zwar nur 4 bestimmte Elemente? z.B. [21] bis [24]?

    Habe es so gemacht, sieht aber ziemlich unschön aus:

    WORD1=ByteArray[21];
    WORD1<<=sizeof(ByteArray[21]);
    WORD1|= ByteArray[22];
    WORD2=ByteArray[23];
    WORD2<<=sizeof(ByteArray[23]);
    WORD2|= ByteArray[24];
    DWORD1=WORD1;
    DWORD1<<=sizeof(WORD1);
    DWORD1|=WORD2;
    

    Gibt bestimmt eine schönere Lösung über die ich sehr dankbar wäre 🙂



  • DeinDWORD = static_cast<DWORD>(Bytearray[21]);
    

Anmelden zum Antworten