UCHAR in hex wandlen und als String ausgeben ? Wie?



  • Ich brauch den String erst in einer Datei.

    Danch muss ich das ganze wieder einlesen und mit ECC Signieren aber da bin ich noch weit entfernt.

    Dein Vorschlag sieht schon super aus, allerdings mosert mein Compiler VS 2003

    Diese zeile an:

    sstr << std::hex << std::setw(2);

    .cpp(113) : error C2039: 'setw' : is not a member of 'std'
    createdata.cpp(113) : error C2593: 'operator <<' is ambiguous



  • #include <iomanip>
    


  • Ah ha, schon besser.

    Aber

    alshex = sstr.str();
    

    createdata.cpp(125) : error C2039: 'str' : is not a member of 'std::basic_string<_Elem,_Traits,_Ax>'

    In welchem Header ist das nun?



  • Sicht das du dich nicht verschrieben hast (.str statt .str())? Denn dann müsste er sich ja auch schon an sstr.str(""); stören. (Ist der Header <sstream>)



  • wenn du dir das oben anschaust habe ich sstr als ostringstream deklariert - die Fehlermeldung besagt aber, dass du str() auf einen string angewendet hast...



  • Ich glaub ich bin zu 👎

    Nun lässt es sich zwar übersetzen, aber die Ausgabe ist unverändert.

    hat also nichts mit 010203040 zu tun. Alles ASCII

    

    ;
     !"#$%&'()*+,-./0;
    123456789:;<=>?@ABCDEFGH;
    IJKLMNOPQRSTUVWXYZ[]^_`;
    abcdefghijklmnopqrstuvwx;
    yz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��;
    ‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨;
    ©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿À;
    ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖר;
    ÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð;

    unsigned char uc_data_byte = 0;
    unsigned char uc_byte_counter = 0;
    int i_block_counter = 0;
    
    ostringstream sstr;
    std::string sstring_as_hex;
    
    // Schleife für die Blöcke 
    // Ausgabestream konfigurieren
    std::cout << std::hex << std::setw(2);
    sstr << std::hex << std::setw(2);
    
    for( i_block_counter = 10; i_block_counter; i_block_counter--  )
    { 
      for( uc_byte_counter = 0; uc_byte_counter < 24; uc_byte_counter++ )
      {
        ++uc_data_byte;
        sstring_as_hex = uc_data_byte;
    
        sstr.str("");
        sstr << uc_data_byte;
        sstring_as_hex = sstr.str();
    
        m_cDataSourceFile << sstring_as_hex;
        std::cout << sstring_as_hex;
      }
    }
    

    Ob ich das jemals lerne 😡



  • wenn du ne binärfile schreiben willst, könntest du dir mal std::fstream::read() und std::fstream::write() an kucken
    in ner binärfile steht des dann schon so drin, wie du das (scheinbar) haben willst



  • Entscheidende Zeile:
    sstr << (int)uc_data_byte;

    Ansonsten schreibst du einen char hinein, der von std::hex nicht beeinflusst wird.



  • Spitze das scheint es gewesen zu sein!!
    Mach es überhaupt Sinn hier mit char zu arbeiten?
    Macht es überhaupt Sinn mit Zahlen und C++ mit char zu arbeiten, oder sollte man diese Variable nur für Zechen verwenden?

    Hier meine Ausgabe!

    1 2 3 4 5 6 7 8 9 a b c d e f101112131415161718;
    191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30;
    3132333435363738393a3b3c3d3e3f404142434445464748;
    494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60;
    6162636465666768696a6b6c6d6e6f707172737475767778;
    797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90;
    9192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8;
    a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0;
    c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8;
    d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0;

    Eine Frage hätte ich noch!!!
    kan man diese Zeile
    1 2 3 4 5 6 7 8 9 a b c d e f101112131415161718;
    in
    0102030405060708090a0b0c0d0e0f101112131415161718;
    umwandeln!

    Super Danke an alle !!! 👍

    Gruß
    Stumpf



  • geht doch viel einfacher:

    void to_hex (unsigned char *in, int len, char *out)
    {
      static char *hex = "0123456789abcdef";
      while (len--)
      {
        *out++ = hex[*in>>4];
        *out++ = hex[*in++ & 0x0f];
      }
      *out = 0;
    }
    

    test:

    #include <stdio.h>
    int main (void)
    {
      char in[] = {1,2,0xff,4,5, 0xab};
      char out[256];
    
      to_hex (in, sizeof(in), out);
      puts (out);
    }
    

    🙂



  • Stumpf schrieb:

    Eine Frage hätte ich noch!!!
    kan man diese Zeile
    1 2 3 4 5 6 7 8 9 a b c d e f101112131415161718;
    in
    0102030405060708090a0b0c0d0e0f101112131415161718;
    umwandeln!

    macht z.b. mein code da^^
    🙂



  • Ja wär auch eine Möglichkeit, hab's nun so gelöst.

    Nochmal Danke !

    if( uc_data_byte > 0xF )
              {
                sstring_as_hex = uc_data_byte;
                sstr.str("");
                sstr << hex << std::setw(2) << (int)uc_data_byte;
                sstring_as_hex = sstr.str();
              }
              else
              {
                // Sonderbehandlung wegen der 0 am Anfang
                sstring_as_hex = uc_data_byte;
                sstr.str("");
                sstr << '0';
                sstr << hex << (int)uc_data_byte;
                sstring_as_hex = sstr.str();
              }
    


  • nach dem hex und setw(2) einfach noch setfill('0') in den Stream, dann brauchst keine SOnderbehandlung



  • So das ist nun draus geworden.
    Erst denkt man oh man (ich seh den Wald vor lauter Bäumen nicht 😮 )
    Und dann ist es ein zwei Zeiler 😃

    string ConvertCharToHexString( const unsigned char &uc  )
    {
      string sstring_as_hex;
      ostringstream sstr;
    
      sstr << hex << setw(2) << setfill('0') << (int)uc;
      sstring_as_hex = sstr.str();
    
      return( sstring_as_hex );
    }
    


  • ich würd aus dem Funktionsparameter stumpf ein unsigned char machen, meinetwegen mti const, aber ohne referenz. Die ist nämlich mit ziemlicher Sicherheit teurer anzulegen, als einfahc ein char zu kopieren. (Faustregel: primitive typen kopieren, rest per const reference übergeben)



  • OK Danke!


Anmelden zum Antworten