[frage] hex zahl zu char zusammenfassen

hansii

Grünschnabel
wunderschoenen guten tag :>

beim versuch einen zahlenwert in einer datei zu speichern ist mir aufgefallen, dass dies ja zeichenweise geschieht und somit zb. die zahl 200000 ganze 6 zeichen wegnimmt, wohingegen man sie mit nur 20bit codieren kann.

ergo hab ich mich daran gesetzt dieses problem zu umschiffen und versucht mittels einer funktion die jeweilige zahl in einen hex-wert und die einzelnen hex-nibbles dann paarweise zu einem char zusammenzufassen um eben fuer die zahl 200000 auch nur (in dem fall 2,5 = 3 byte) zu brauchen

dabei rausgekommen ist folgendes .. so richtig hinhauen, tut es allerdings nicht, weswegen ich um hilfe bitte :)

Code:
    ...
    char *result = new char;
    char *tmp= result;
    char *_tmp = new char;
    int i=0, quotient = 200000;
    
    do {
	*_tmp = "0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f"[ abs( quotient % 16 ) ];
	if(i%2 == 0 || i == 0) { *tmp = *_tmp; i++; }
	else { *tmp ^= (*_tmp << 4); i++; tmp++; }
	quotient /= 16;
   } while ( quotient );

    for(i=0;i<=3;i++) if(!tmp[i]) tmp[i] = 0x00; // auf 4 byte auffuellen
    std::reverse( result, tmp);
    cout << result << endl;

    delete result;
    delete tmp;
    delete _tmp;
    ...

sieht jemand den fehler oder hat vll schonmal jmd das problem geloest ? :)

mfg
 
Hi.
hansii hat gesagt.:
ergo hab ich mich daran gesetzt dieses problem zu umschiffen und versucht mittels einer funktion die jeweilige zahl in einen hex-wert und die einzelnen hex-nibbles dann paarweise zu einem char zusammenzufassen um eben fuer die zahl 200000 auch nur (in dem fall 2,5 = 3 byte) zu brauchen

dabei rausgekommen ist folgendes .. so richtig hinhauen, tut es allerdings nicht, weswegen ich um hilfe bitte :)

Code:
    char *result = new char;
    char *tmp= result;
Du allozierst hier ein einzelnes Zeichen. Das hättest du auch mit
C++:
char result;
char* tmp = &result;
machen können. (bzw. völlig ohne die temporären Zeigervariablen).

hansii hat gesagt.:
Code:
	*_tmp = "0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f"[ abs( quotient % 16 ) ];
Also damit meintest du wohl eher sowas wie
C++:
*_tmp = "0123456789abcdef"[quotient%16];
Bei deinem Code ermittelst du ein Zeichen aus dem Bereich "0x00, 0x01, 0x02".
hansii hat gesagt.:
Code:
	if(i%2 == 0 || i == 0)
0 % 2 ist übrigens auch 0.

hansii hat gesagt.:
Code:
    for(i=0;i<=3;i++) if(!tmp[i]) tmp[i] = 0x00; // auf 4 byte auffuellen
    std::reverse( result, tmp);
tmp bzw. result zeigen jeweils nur auf ein einzelnes Zeichen. Da kannst du nichts auffüllen und auch nichts umdrehen.

Gruß

/edit: Na, ich will mal nicht nur meckern. Man kann einen Integer z.B. so in hexadezimaler Schreibweise umwandeln:
C++:
#include <sstream>
#include <string>
#include <iomanip>

using namespace std;
...
ostringstream ostr;
int x = 200000;
ostr << hex << x;
string hx = ostr.str();
In dem std::string hx steht jetzt "30d40" drin.
 
Zuletzt bearbeitet:
hi :>

danke fuer die schnelle antwort, die hinweise arbeite ich gerade ein

das umwandeln in einen string, in welchem die zahl in hexadezimaler schreibweise stand, funktioniert schonmal .. das problem an sich ist eben, dass die einzelnen elemente eines strings aber immernoch chars sind und somit pro zeichen ein nibble verloren geht

das ergebnis der funktion sollte im fall x = 200000 lauten: 0x00 0x03 0x0D 0x40 - daher auch der versuch von mir mit dem oben angegebenen zeichenarray .. *gruebel :)

mfg
 
Aha, da würde ich den Wert gar nicht erst in einen String konvertieren:
C++:
int x = 200000;
bool hi = false;
unsigned char byte = 0;
string res;

cout << setfill('0');
while (x > 0 || hi) {
  byte +=  ( x % 16) * (hi ? 16 : 1);
  if (hi) {
    res.push_back(byte);
    cout << "0x" << hex << setw(2) << static_cast<int>(byte) << " ";
    byte = 0;
  }
  hi = !hi;
  x /= 16;
}
reverse(res.begin(), res.end());

Die Ausgabe ist natürlich nur zur Überprüfung. Wenn du immer 4 Byte ausgeben willst, mußt du nur die while Bedingung ändern.
Gruß
 
danke fuer die schnelle hilfe

letztenendes genuegte mir das ergebnis von

C++:
int value = 200000;
char *res;
res = (char *)&value;

voellig

mfg :)
 
Zurück