Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von funkheld »

Hallo, guten Tag.

Wie kann man eine Decimalzahl (56789) in Hex zum Printen bitte umwandeln?
Nicht mit Purebasic-Umwandlungsbefehlen sondern zu Fuss....

Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von RSBasic »

Wenn du selber umrechnen willst, hier zwei Wikipedia-Seiten, die dir verständlich die jeweiligen Zahlensysteme zeigen:
Dezimalsystem (Basis 10): https://de.wikipedia.org/wiki/Dezimalsystem
Hexadezimalsystem (Basis 16): https://de.wikipedia.org/wiki/Hexadezimalsystem
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von NicTheQuick »

So zum Beispiel:

Code: Alles auswählen

Procedure.s hexhex(value.i)
	Protected result.s = ""
	
	While value
		; Und wenn du lieber A-F statt a-f hast, dann einfach das 'a' durch ein 'A' ersetzen.
		result = Chr('0' + (value % 16) + (value % 16) / 10 * ('a' - '0' - 10)) + result
		value / 16
	Wend
	
	ProcedureReturn result
EndProcedure

Debug hexhex(56789)
Bild
¯\_(ツ)_/¯
Beiträge: 141
Registriert: 18.08.2017 09:35

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von ¯\_(ツ)_/¯ »

Danke für den Code NicTheQuick, ist immer interessant, wie der Code ungefähr intern abläuft.

Code: Alles auswählen

Procedure.s hexhex(value.i)
Bild
Zuletzt geändert von ¯\_(ツ)_/¯ am 18.09.2018 11:11, insgesamt 1-mal geändert.
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von Kiffi »

NicTheQuick hat geschrieben:

Code: Alles auswählen

Debug hexhex(56789)
sozusagen eine Bibi Blocksberg - Prozedur
Bild
Hygge
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von RSBasic »

Da hatten zwei User den gleichen Gedanken. :lol:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von NicTheQuick »

:lol:
Schön, dass es euch gefällt. Ich hab zur endgültigen Verwirrung noch das Bool() entfernt, damit man nicht mehr so gut durchblickt und mehr Fragen stellen kann.

Wenn das ganze schnell sein soll, dann würde ich es aber anders machen. Wichtig war mir erst mal, dass es funktioniert.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von NicTheQuick »

Ich hab mal vor Ewigkeiten, oder genauer gesagt im Oktober 2014 eine Procedure geschrieben, die von jeder Basis in jede andere konvertieren kann, und dabei sogar gebrochene Zahlen kann.
Heute würde ich das wieder anders machen, mit mehr Pointern, aber es funktioniert immer noch. Hier der unveränderte Originalcode:

Code: Alles auswählen

Procedure.s Base_Convert(Value.s, InBase.l = 10, OutBase.l = 2, nbDecimals.l = 100)
	Protected p.l, *c.Character, left.s, l.l, lout.s, Mod.l, out.s, rout.s, right.s, a.l
	
	*c = @Value
	While *c\c
		Select *c\c
			Case '0' To '9' : *c\c - '0' + 1
			Case 'a' To 'z' : *c\c - 'a' + 11
			Case 'A' To 'Z' : *c\c - 'A' + 11
			Case '.' ;do nothing
			Default : *c\c = 1
		EndSelect
		*c + SizeOf(Character)
	Wend
	
	p = FindString(Value, ".", 1)
	If p
		left = Left(Value, p - 1)
		right = Mid(Value, p + 1, Len(Value) - p)
	Else
		p = Len(Value)
		left = Value
		right = ""
	EndIf
	
	If left ;Vorkommateil
		While left <> ""
			Mod = 0 : *c = @left : out = ""
			While *c\c
				Mod = Mod * InBase + *c\c - 1
				l = Mod / OutBase
				If l Or out
					out + Chr(l + 1)
				EndIf
				Mod - (l * OutBase)
				
				*c + SizeOf(Character)
			Wend
			
			left = out
			lout = Chr(Mod + 1) + lout
		Wend
	Else
		lout = Chr(1)
	EndIf
	
	If right ;Nachkommateil
		a = 0
		p = Len(right)
		While right <> Chr(1) And a < nbDecimals
			*c = @right + (p - 1) * SizeOf(Character)
			p = 0 : Mod = 0 : out = ""
			While *c >= @right
				Mod + (*c\c - 1) * OutBase
				out = Chr((Mod % InBase) + 1) + out
				Mod / InBase
				*c - SizeOf(Character)
				p + 1
			Wend
			
			right = out
			rout + Chr(Mod + 1)
			a + 1
		Wend
	EndIf
	
	If rout : out = lout + "." + rout : Else : out = lout : EndIf
	
	*c = @out
	While *c\c
		Select *c\c
			Case 1 To 10 : *c\c + '0' - 1
			Case 11 To 36 : *c\c + 'A' - 11
			Case '.' ;do nothing
			Default : *c\c = '?'
		EndSelect
		*c + SizeOf(Character)
	Wend
	
	ProcedureReturn out
EndProcedure

Define unkomprimiert.s = "12345678901234567890"
Define komprimiert.s = Base_Convert(unkomprimiert, 10, 36, 100)
Define dekomprimiert.s = Base_Convert(komprimiert, 36, 10, 100)

Debug "Unkomprimiert: " + unkomprimiert
Debug "Komprimiert: " + komprimiert
Debug "Dekomprimiert: " + dekomprimiert

Define s.s
Debug "Beispiel für 10 -> 2 und zurück"
s = Base_Convert("3.1415926535897932384626433832795028841971693993", 10, 2, 100)
Debug s
Debug Base_Convert(s, 2, 10, 100)
Debug "3.1415926535897932384626433832795028841971693993 (Original)"
Debug "Beispiel für 10 -> 36 und zurück"
s = Base_Convert("3.1415926535897932384626433832795028841971693993", 10, 36, 100)
Debug s
Debug Base_Convert(s, 36, 10, 100)
Debug "3.1415926535897932384626433832795028841971693993 (Original)" 
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von Nino »

Jetzt fehlt eigentlich nur noch ein Video aus Deinem Bastelkeller, wie Du das Ganze umwandelst zu (Aachener) Printen. Bin schon sehr gespannt. :mrgreen:
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Beitrag von RSBasic »

+1

Ich höre schon die Erstellung des Videos... Hallo liebe Freunde des Bastelkellers und ...
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten