Seite 1 von 2

Eine decimalzahl in Hex umwandeln zu Printen (zu Fuss)

Verfasst: 18.09.2018 10:01
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

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

Verfasst: 18.09.2018 10:44
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

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

Verfasst: 18.09.2018 11:06
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)

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

Verfasst: 18.09.2018 11:11
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

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

Verfasst: 18.09.2018 11:11
von Kiffi
NicTheQuick hat geschrieben:

Code: Alles auswählen

Debug hexhex(56789)
sozusagen eine Bibi Blocksberg - Prozedur
Bild

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

Verfasst: 18.09.2018 11:12
von RSBasic
Da hatten zwei User den gleichen Gedanken. :lol:

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

Verfasst: 18.09.2018 11:14
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.

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

Verfasst: 18.09.2018 11:25
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)" 

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

Verfasst: 18.09.2018 13:26
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:

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

Verfasst: 18.09.2018 13:33
von RSBasic
+1

Ich höre schon die Erstellung des Videos... Hallo liebe Freunde des Bastelkellers und ...