hex einlesen und abspeichern



  • hi,

    ich habe einen hex string von ner datei. den will ich erst mal in ein struktur geben dann modifizieren und wieder speicher. da die daten hex sind muss ich sie erst mal einlesen und ind dez wandeln und auch noch swappen für big/little endian

    in meinem fall hab ich zb parameter, paddingbyte_0, voltage_max, voltage_min...
    wie bring ich die recht simple in die data_dec struktur? ich muss sie dann halt auch wieder in hex umwandeln und speichern in die datei! kann man das einfacher machen als ich?^^

    struct data_hex
    {
    	string parameter; // 1 byte
    	string paddingbyte_0; // 1 byte
    	string voltage_max; // 2 byte
    	string voltage_min; // 2 byte
    }data_hex;
    
    struct data_dec
    {
    	unsigned char parameter;
    	unsigned char paddingbyte_0;
    	unsigned short voltage_max;
    	unsigned short voltage_min;
    }data_dec;
    
    char xtod(char c) 
    {
     if (c>='0' && c<='9') return c-'0';
     if (c>='A' && c<='F') return c-'A'+10;
     if (c>='a' && c<='f') return c-'a'+10;
     return c=0;        // not Hex digit
    }
    
    int HextoDec(char *hex, int l)
    {
        if (*hex==0) return(l);
        return HextoDec(hex+1, l*16+xtod(*hex)); // hex+1?
    }
    
    int xstrtoi(char *hex)    // hex string to integer
    {
        return HextoDec(hex,0);
    }
    
    int main()
    {
    data_hex data_hex;
    data_dec data_dec;
    string str;
    
    string line = "01008D03C201"; // aus datei eingelesen
    
    data_hex.parameter = line.sub_str(0, 2);
    data_hex.paddinbyte_0 = line.sub_str(2, 2);
    data_hex.volatage_max = line.sub_str(4, 4);
    data_hex.volatage_max.append(data_hex.volatage_max.substr(0, 2)); // swap big little endian
    data_hex.volatage_max.erase(0, 2); // swap big little endian
    data_hex.volatage_min = line.sub_str(8, 4);
    data_hex.volatage_min.append(data_hex.volatage_min.substr(0, 2)); // swap big little endian
    data_hex.volatage_min.erase(0, 2); // swap big little endian
    
    data_dec.parameter = xstrtoi(data_hex.parameter);
    data_dec.paddinbyte_0 = xstrtoi(data_hex.paddinbyte_0);
    data_dec.volatage_max = xstrtoi(data_hex.volatage_max);
    data_dec.volatage_min = xstrtoi(data_hex.volatage_min);
    }
    


  • #include <iomanip>
    #include <sstream>
    #include <iostream>
    
    int main() {
    	std::stringstream stream("0f");
    	int i;
    	stream >> std::hex >> i;
    
    	std::ofstream file("C:\\name.txt");
    	file << std::hex << std::setw(2) << std::setfill('0') << i;
    
    }
    


  • bei:

    stringstream str;
    str << "0500";
    str >> std::hex >> integer_value;
    

    das klappt nicht, warum?



  • str << "05"; 
    str >> std::hex >> char_value;
    

    da kommt dann char_value == 48 warum?



  • julian1 schrieb:

    bei:

    stringstream str;
    str << "0500";
    str >> std::hex >> integer_value;
    

    das klappt nicht, warum?

    Was klappt nicht?
    Was kommt raus und was erwartest du?



  • julian1 schrieb:

    str << "05"; 
    str >> std::hex >> char_value;
    

    da kommt dann char_value == 48 warum?

    Weil er char als zeichen interpretiert



  • will aber 5 in char_value haben!



  • justin1 schrieb:

    will aber 5 in char_value haben!

    std::stringstream str("5");
    char v;
    str >> v;
    

    Wenn du "05" hast, wird hald zuerst nur ein Zeichen gelesen, also 0, und das ist als Dezimal 48. (ASCII).

    Dann hast du 5 als Zeichen in v und kannst es ausgeben.



  • str << "05";
    str >> std::hex >> char_value;
    char_value = (int)char_value; //?????
    


  • julian1 schrieb:

    str << "05";
    str >> std::hex >> char_value;
    char_value = (int)char_value; //?????
    

    Erklär bitte mal genau, was du willst. Uns ist schon klar, was da passiert, aber dir anscheinend nicht, also sag mal, was du denkst, dass da kommen sollte.



  • ich lese einen hex wert ein und gebe in in eine struktur...den wert der struktur schreibe ich in eine textbox hinein!

    wenn ich nun "05" einlese als hex will ich die char value befüllen...und die value der textbox zuweisen...dort soll halt dann 5 als dez stehen...



  • Dann ist aber ein char der falsche Datentyp dafür.

    Liest, wie oben beschrieben in einen integer ein und (falls nötig) kannst du den dan immernoch in einen string reinquetschen.


Anmelden zum Antworten