Zum Inhalt springen

Empfohlene Beiträge

Geschrieben
Das ist nicht Binär sondern Hexadezimal.

Ich wieder mit meinem binär ;)

Was ist eigentlich der unterschied zwischen den beiden?

mit _itoa kannst du eine Zahl in einen C-String konvertieren.

Hm…. ich glaube ich habe mich falsch ausgedrückt, also ich habe in BYTE den Wert (0x6BFBB3AF) was ich jetzt eigentlich will ist den wert in ASCII zu convertieren.

Geschrieben
Ich wieder mit meinem binär ;)

Was ist eigentlich der unterschied zwischen den beiden?

Als binär oder dual bezeichnet man die Darstellung einer Zahl im System zur Basis 2, also nur mit den Ziffern 1 und 0. Hexadezimal (eigentlich: sedezimal) ist die Darstellung eines Wertes im System zur Basis 16. Wichtig ist, dass beides Darstellungen, also textuelle Repräsentationen von Werten sind. Ein und derselbe Wert hat mehrere Darstellungen, je nachdem, welches System man benutzt.

Man spricht übrigens auch von binär, wenn man von Daten redet, die nicht als Text interpretierbar sind. Das eine hat aber mit dem anderen nichts zu tun.

Hm…. ich glaube ich habe mich falsch ausgedrückt, also ich habe in BYTE den Wert (0x6BFBB3AF)
Der Wert ist zu groß für ein Byte. Kann es sein, dass du ein Array von Bytes hast, oder einen Zeiger? Ein paar mehr Details wären hier hilfreich.

was ich jetzt eigentlich will ist den wert in ASCII zu convertieren.
Der Wert liegt außerhalb des Bereichs der ASCII-Codierung, die geht nur bis 127. Ich glaube aber, das ist gar nicht, was du willst.

Du willst wahrscheinlich einen String, der die hexadezimale Darstellung des Wertes enthält, der sich ergibt, wenn man 4 im Speicher hintereinander liegende Byte-Werte als einen 32-Bit-Wert interpretiert. Stimmt's?

Da wäre aber vorher noch zu klären, ob die Bytes in Little- oder Big-Endian-Reihenfolge vorliegen, also ob das erste Byte das mit der niedrigsten oder höchsten Wertigkeit ist.

Geschrieben
Was ist eigentlich der unterschied zwischen den beiden?

Die Zahlenbasis. Binär (dual) 2, hexadezimal 16. Die "normale" dezimale Darstellung hat die Basis 10.

also ich habe in BYTE den Wert (0x6BFBB3AF)

"BYTE" ist kein standardisierter C++-Datentyp. Man kann nun vermuten, dass Du ein 8-Bit breites Byte meinst und das somit die von Dir angegebene Zahl von diesem Datentyp aufgrund ihrer Größe nicht aufgenommen werden kann (siehe Antwort von Klotzkopp) und Du somit vielleicht einen Fehler machst.

Ein Aufassen der Zahl als Folge von vier 8-Bit-Bytes, die vier ASCII-Zeichen enthalten, scheint auch nicht sonnvoll, da der Inhalt der einzelnen Bytes bei der gegebenen Beispiel-Zahl nicht als sinnvolle ASCII-Zeichenabfolge interpretiert werden kann.

Du solltest daher lieber noch einmal genau beschreiben, was Du wohin konvertieren möchtest und auch woher Du die Zahl hast.

wert (0x6BFBB3AF) in std::string convertieren ?

Wenn Du eine Integer-Zahl dezimal oder hexadezimal in einen std::string schreiben möchtest, kannst Du dies über einen std::ostringstream erreichen.

Geschrieben

Der Wert ist zu groß für ein Byte. Kann es sein, dass du ein Array von Bytes hast,

ja es ist ein Array von Bytes

Du willst wahrscheinlich einen String, der die hexadezimale Darstellung des Wertes enthält, der sich ergibt, wenn man 4 im Speicher hintereinander liegende Byte-Werte als einen 32-Bit-Wert interpretiert. Stimmt's?

ja

Da wäre aber vorher noch zu klären, ob die Bytes in Little- oder Big-Endian-Reihenfolge vorliegen, also ob das erste Byte das mit der niedrigsten oder höchsten Wertigkeit ist.

Es ist so die Daten liegen in binär Format in Datenbank (Datentyp varbinary)

Ich bekomme die allerdings zurück als Hex zurück. Es ist jetzt so, dass die werte muss ich in eine Datei schreiben. Ob die Bytes in Little oder Big-Endian-Reihenfolge vorliegen weiss ich nicht, kann man es irgendwie überprüfen.

Ich dachte mir, es reicht wenn ich die zwei erste Zeilen bei der ausgabe einfach ignoriere, also etwa so von 0x6BFBB3A auf 6BFBB3A

Geschrieben
Ich bekomme die allerdings zurück als Hex zurück.
Du kannst ein Array von Bytes nicht "als Hex" zurückbekommen!

"Hex" ist eine Darstellungsart! Byte-Arrays tragen diese Eigenschaft nicht in sich. Sie kommt erst zum Tragen, wenn du die Bytes anzeigst oder ausgibst.

Mal ein Vergleich:

Wenn dir dein Gehalt überwiesen wird, bekommst du das in großen oder kleinen Scheinen?

Weder noch, in welcher Form du das Geld später in den Händen hältst, hängt davon ab, was dir der Automat ausspuckt. Das ist keine Eigenschaft, die das dir überwiesene Gehalt in sich trägt.

Genauso ist es mit binär und hex bei Zahlenwerten. Erst wenn du einen Wert darstellst (ausgibst, als Text speicherst), ist das relevant. Vorher ist diese Eigenschaft nicht vorhanden. Deswegen kannst du Zahlenwerte nicht "als Hex" zurückbekommen, genauso, wie dir dein Gehalt nicht in 10-Euro-Scheinen überwiesen werden kann.

Ich hoffe, das ist jetzt klar geworden.

Es ist jetzt so, dass die werte muss ich in eine Datei schreiben.
In welcher Form?

Ob die Bytes in Little oder Big-Endian-Reihenfolge vorliegen weiss ich nicht, kann man es irgendwie überprüfen.
Kennst du die Werte, die dabei herauskommen sollen, zumindest ungefähr? Zeig doch mal 4 Beispielbytes.
Geschrieben

Es tut mir Leid für die verwierung 9

Vielen Dank an euch alle für die ausführliche Erklärung.

Versuche das gleiche noch ein wenig genauer zu beschreiben:

Ich habe einen BYTE b[8] in dem BYTE steht etwas so was 0x0035f3b6 "kû³¯"

Also:


[0] 107 'k' unsigned char
[1] 251 'û' unsigned char
[2] 179 '³' unsigned char
[3] 175 '¯' unsigned char
[4] 0 unsigned char
[5] 0 unsigned char
[6] 0 unsigned char
[7] 0 unsigned char
[/PHP]

Jetzt was ich machen muss ist die Daten in Hex umwandeln, also etwa so:

[PHP]
[0x0] 0x6b 'k' unsigned char
[0x1] 0xfb 'û' unsigned char
[0x2] 0xb3 '³' unsigned char
[0x3] 0xaf '¯' unsigned char
[0x4] 0x00 unsigned char
[0x5] 0x00 unsigned char
[0x6] 0x00 unsigned char
[0x7] 0x00 unsigned char

und ausschließlich die werte 6bfbb3f in einem string speichern.

Geschrieben

unsigned char b[4] = { 107, 251, 179, 175 };

ostringstream st;
st << hex << setfill('0');
for( int i=0; i<4; ++i )
{
st << setw(2) << static_cast<unsigned int>( b[i] );
}
string s = st.str();[/code]

Der Cast nach unsigned int ist notwendig, weil unsigned char für die Ausgabe normalerweise als Zeichen interpretiert wird. Das wollen wir hier aber nicht.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...