Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1588to1592
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Hex 2 Bin

Hex 2 Bin
17.11.2017 13:07:12
Basti
Hallo Forum,
hab wieder meine VBA-Grenzen erreicht. Das Thema wird zu Hauf im World-Wide-Web erwähnt nur habe ich keine Ahnung, wie ich meine Idee umsetzen kann.
Ich möchte, dass alle Zellen im markierten Bereich von Hexadezimal in Binär umgewandelt werden.
Sub test()
Debug.Print HexToBin(410)
End Sub

Function HexToBin(sHex As String)
Dim normal As String, reverse As String, requiredLength As Integer, i As Integer, sFormat    _
_
_
As String
'Reversed with strange formatting :-)
sFormat = "@@@@-@@@@-@@@@-@@@@"
' straight conversion via decimal
normal = CStr(DecToBin(HexToDec(sHex)))
'pad to required lengths
Select Case Len(normal)
Case Is > 8
requiredLength = 16
Case Is > 5
requiredLength = 8
Case Else
requiredLength = 5
End Select
Do While Len(normal) 
Vielen Dank für Eure Hilfe.
Gruß
Basti

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hex 2 Bin
17.11.2017 14:45:52
Daniel
Hi
du sollest deine eigenen Funktionen nicht so nennen wie bereits bestehende VBA- und Excelfunktionen.
das könnte Verwechslungen geben.
eine Umwandlung von Hexadezimal in Binär würde ich mit einfachem Text ersetzen durchführen:
ersetze (in der richtigen Reihenfolge)
"0" durch "0000"
"1" durch "0001"
"2" durch "0010"
"3" durch "0011"
...
"E" durch "1110"
"F" durch "1111"
Gruß Daniel
Das meinst du aber nicht im Ernst Daniel? (owT)
17.11.2017 15:23:31
EtoPHG

AW: Ausprobiert?
17.11.2017 16:20:35
Daniel
in welchen Fällen würde denn meine Methode kein korrektes Ergebnis liefern?
Gruß Daniel
Darum ging's sicher nicht, ...
17.11.2017 18:12:29
Luc:-?
…Daniel,
sondern um 16× ersetzen! Allerdings käme in diesem Fall auch bei integriertem Vorzeichen eine richtige Umwandlung heraus. Schwierig würde es nur mit Xl-/vbFktt und bei Umwandlung in DezimalZahlen wdn. Dabei könnte dann auch eine Rolle spielen, ob DezimalZiffern nur hexadezimal codiert wurden, was eigentlich der Inhalt meines 1.Pkts unten wdn sollte…
Gruß, Luc :-?
Anzeige
AW: Darum ging's sicher nicht, ...
17.11.2017 18:46:08
Daniel
ja mei, was ist schon 16x ersetzen.
da kann man ja eine intelligente Schleife basteln
oder man läuft mit einer Schleife durch den Text und ersetzt jede Hex-Ziffer einzeln.
die rein textbasierte Methode hätte halt den Vorteil, dass sie Hex- und Bin-Zahlen in beliebiger Größe verarbeiten kann.
Gruß Daniel
Aber auch nur diese u.monodirektional (s.u.)! owT
18.11.2017 01:12:01
Luc:-?
:-?
Ging's um was anderes?
18.11.2017 02:03:46
Daniel
Nein!
Hier nicht, aber siehe Etos Einwurf! owT
19.11.2017 03:51:29
Luc:-?
:-?
Welchen konkret? owT
19.11.2017 17:08:58
Daniel
Besonders den letzten! owT
19.11.2017 17:44:36
Luc:-?
:-?
und der trifft nicht zu.
19.11.2017 18:11:54
Daniel
nun ja, dieser Einwurf trifft nur leider nicht zu.
Wenn man "3" durch "0011" ersetzen kann, dann kann man auch "0011" durch "3" ersetzen.
dh, die reine Textumwandlung funktioniert auch von Binär nach Hex.
Man muss hier nur vorher die Binärzahl in die passenden 4er-Blöcke teilen.
mit dem Oktalsystem funktioniert es genauso, nur hat man dann eben nicht 4, sondern nur 3 Binärstellen.
eine Umwandlung von Hex nach Dez oder umgekehrt war hier nicht gefragt.
Gruß Daniel
Anzeige
Ich hatte ihm darauf geantwortet u. die Blöcke ...
19.11.2017 18:36:33
Luc:-?
…für RückUmwandlung bereits erwähnt, Daniel;
allerdings geht das immer nur von Hex bzw OktBin und umgekehrt (Blöcke), nicht aber von bspw HexOkt. Diese String-Manipulationen sind also quasi nur eine (hier mögliche) Notlösung, keine echte Konvertierung. Das hatte Hansueli wohl (doch eher als 16×) vor allem gestört…
Luc :-?
und was war nochmal die Fragestellung der Eingangs
19.11.2017 18:44:42
Daniel
frage?
Gruß Daniel
Pfffh, geht's nun wieder von vorne los? Streite …
19.11.2017 20:24:32
vorne
…dich gefälligst mit Hansueli, ich hatte das nur erläutern wollen.
Meine eigene Meinung dazu steht weiter unten bzw ist dir bekannt, aber das würde hier tatsächlich erst lohnen, wenn der Frager nun aufeinmal noch mit allen möglichen, diesbzgl Wünschen käme…
Luc :-?
Anzeige
das kann ich tun, wenn er ,mir antwortet. owt
19.11.2017 20:40:34
Daniel
aber dann müsste er erklären, warum
19.11.2017 20:52:30
Daniel
er erst mich fragt, ob ich meine Lösung ernst meine, wenn er dann eine auf gleiche weise arbeitende Methode vorschlägt.
Dann wären es doch die 16x, aber später ...
20.11.2017 02:58:29
Luc:-?
…hatte er ja anders begründet! ;-]
Glaube übrigens kaum, dass er dir antworten wird, höchstens unten…
Luc :-?
Ich hab meine Verständnis-Grenze erreicht,
17.11.2017 15:20:04
EtoPHG
Basti,
Was genau willst du?
Woher hast du die HexToBin Function und v.a. was genau kann man mit den Parameter steuern?
Was machen die DecToBin und die HexToDec Funktionen?
Warum soll also ein HEX-String zuerst DEC umgewandelt werden, dann der DEC String in BIN und am Schluss soll wieder ein BIN String rauskommen? Sehr undurchsichtig und verwirrend.
Diese Funktion
Function HEXtoBIN(rCT As String, Optional iFillToLen As Integer) As String
Dim lx As Long
For lx = 1 To Len(rCT)
HEXtoBIN = HEXtoBIN & WorksheetFunction.HEX2BIN(Mid(rCT, lx, 1), 4)
Next lx
If Len(HEXtoBIN) 
wird ein HEX String beliebiger Länge in einen Binär-String beliebiger Länge umgewandelt. Mit dem Parameter iFillToLen kann man optional noch sagen, ob führende Nullen auf die verlangte Länge aufgefüllt werden sollen.
Die Funktion kann einfach als Formel in eine Zelle geschrieben werden.
Gruess Hansueli
Anzeige
AW: Ich hab meine Verständnis-Grenze erreicht,
17.11.2017 15:48:50
Basti
Hallo Hansueli,
der Code stammt von http://www.vbaexpress.com/forum/showthread.php?45350-Solved-Hex-to-Binary-conversion-not-using-HEX2BIN
Er wandelt, die unter in debug.print(410) enthaltene Zahl in Binär um. Ich habe in einer Spalte meiner Tabell Hex-Wert, die ich gerne markieren und durch ein Makro in Binär-Werte umwandeln möchte.
Gruß
Basti
AW: Ich hab meine Verständnis-Grenze erreicht,
17.11.2017 15:52:37
EtoPHG
Hallo Basti,
Und wo ist das Problem?
1. Warum ich die Hex2Bin Funktion nicht nutzen sollte ist mir nicht klar, aber Daniels Lösung würde diese auch nicht brauchen!
2a. Hilfsspalte mit der Funktion und Bezug auf deine Zellen/Spalte mit den Hexwerten
2b. Resultatwerte (binär) Kopieren und als Werte über die Hex-Spalte einfügen, fertig!
Gruess Hansueli
Anzeige
AW: Ich hab meine Verständnis-Grenze erreicht,
17.11.2017 16:18:55
Axel
Ich bedanke mich, hat super geklappt!
Grüße Heike
Das ist alles nicht so einfach, ...
17.11.2017 17:52:56
Luc:-?
…Basti,
wie es den Anschein zu haben scheint! Es ist nämlich zwischen 3-4 verschiedenen Möglichkeiten zu unterscheiden (hatte mich vor Jahren mal intensiver damit befasst):
1.0 Eine dezimale Ganzzahl ist ziffernweise hexadezimal codiert worden; dann könnte Daniels Methode angewendet wdn. (In der EDV auch ein durchaus übliches Verfahren)
2.0 Eine positive dezimale Ganzzahl ist komplett in eine hexadezimale Zahl gewandelt worden; dann könnte Hansuelis oder eine vglbare Methode angewendet wdn (gilt nicht für 3.!).
3.0 Eine beliebige dezimale Ganzzahl ist komplett in eine hexadezimale Zahl gewandelt worden, wobei ihr Vorzeichen integriert wurde →
3.1 Xl-Methode: Die Fkt DEZINHEX arbeitet vom dezimalen Äquivalent von 8000000000 (-549 755 813 888) bis zu dem von 7FFFFFFFFF (549 755 813 887), also auf Basis von 10 HexDezStellen. Das müsste hier berücksichtigt wdn! Aber
3.2 Vb-Methode: Die vbFkt Hex arbeitet mit nur 8 HexDezStellen, also von 80000000 (-2 147 483 648) bis 7FFFFFFF (2 147 483 647)!
• Falls also die 3.Methode zum Einsatz kommen soll und die HexZahl nicht mehr als max 10 Stellen hat, kann mit der Xl-Fkt in eine DezZahl gewandelt wdn. Allerdings lässt sich diese ggf nicht mit einer Xl-Fkt in eine Binärzahl wandeln, weil hierbei ebenfalls 10 BinärStellen Maximum sind!
• Falls die HexZahl aber mehr als 10 Stellen hat und folglich VBA zum Einsatz kommen muss, ist zu entscheiden, wie im Falle von negativen Zahlen, die ja eine vereinbarte MaximalLänge der Zahl benötigen, zu verfahren ist, zB 8er-, 4er- oder gar nur 2er-Schritte!
• Spielen negative Zahlen hingg keine Rolle, kann nach 2. oder evtl sogar 1. verfahren wdn.
Feedback nicht unerwünscht! Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
Ja, man kann es auch beliebig kompliziert
17.11.2017 21:11:08
EtoPHG
machen, Luc
Wenn schon denn schon, müsste man noch über endianness (little-, mixed- oder big-endian order) reden, nebst Deiner Erwähnung von positiv, negativ, über exponentielle (interne Speicherung) Darstellungen von Dezimalzahlen etc. etc.
M.E. gings hier um eine simple HEX-Binär Transformation ohne das ganze Speicher Brimborium. Darum mein etwas simplerer Vorschlag. Dieser ist übrigens mit einer fehlerhaften Angabe behaftet. Der Parameter iFillToLen füllt mit Nullen rechtsbündig und nicht mit führenden Nullen, was ja auch irgendwie überflüssig ist.
Typischerweise werden solche HEX/BINÄR Strings auch heute noch zur Darstellung von Belegungen (z.B. Fächer in einer Lagerebene, Tagesbelegungn in den Tagen eines Jahres, Markierungen in quadratischen Matrizen etc.) gebraucht. Mir erschien jedenfalls das VBA Gedöns im geposteten Code als völlig daneben und der Vorschlag von Daniel sind reine String Manipulationen, was dann z.B. bei der Umwandlung von dezimal zu hex, octal oder binär, in allen Kombination und Richtungen, irgendwie versagt.
Gruess Hansueli
Anzeige
Natürlich hast Du damit recht, ...
18.11.2017 01:09:16
Luc:-?
…Hansueli,
weshalb ich mich auch ausdrücklich auf ±Ganzzahlen beschränkt hatte. Das Ersetzen einer einfachen HexZiffernFolge durch eine binäre ist dagegen relativ einfach, nur sagt die nach Xl- oder VB-Standard nichts über positiv oder negativ aus, wenn ihre Stellen­zahl nicht bestimmten Regeln folgt und damit die Anzahl der Vornullen festgelegt wdn kann/muss. Alternativ könnte man natürlich davon ausgehen, dass alle Vornullen angegeben worden sind und damit auch die Anzahl der Vornullen der erzeugten Binärzahl festgelegt ist. Deshalb ist es hierbei ja auch kontraproduktiv, eine Dezimal­Umwand­lung einzuschieben, was ich unter 3. andeuten wollte.
Falls es tatsächlich nur um Signierung gehen sollte, zB die Monate eines Jahres, steht die Stellenzahl ja ohnehin fest und ± wäre irrelevant. Aber, obwohl darauf einiges hinzudeuten scheint, kann das ja nur der Fragesteller selbst wissen, der dann allerdings auch von selbst hätte auf die Lösung kommen können, denn er müsste ja wissen, was er wie signiert und dann hexadezimal zusam­men­gefasst hat (es sei denn, das war jemand anderes).
Falls Daniel das so gemeint hat, wie es geschrieben steht, ginge es nur so, wenn jede HexaZiffer durch eine vollständige 4stellige Bit-Folge ersetzt würde (ggf könnten die ganz linken Vornullen weggelassen wdn). Das geht dann aber nur für Hex→Bin oder Okt→Bin, quasi als Einbahnstraße*. Umgekehrt (unter der Voraussetzung, dass alle Stellen angegeben wurden bzw links fehlende Vornullen ergänzt wdn) wird's auf diese Weise schwierig; man muss dann von rechts nach links in 4er- bzw 3er-Gruppen portio­nieren.
Eine universelle und bidirektionale Konvertierung sähe natürlich anders aus und müsste im Sinne meines 3.Pkts geregelt sein.
* Mal als FmlBsp mit der unpublizierten UDF RepOpt:
=--RepOpt("substitute";16;1;{2.3};"3FF";VSplit("0123456789ABCDEF";""); HEXINBIN(VSplit("0123456789ABCDEF";"");4)) ⇒ 1111111111
=BININHEX(1111111111) ⇒ FFFFFFFFFF (mit den 2 fehlenden Vornullen ergäbe das #ZAHL!)
=RepOpt("substitute";16;1;{2.3};"001111111111";HEXINBIN(VSplit("0123456789ABCDEF";"");4); VSplit("0123456789ABCDEF";"")) ⇒ 3FF
In diesem simplen Fall klappt das auch umgekehrt, sonst wohl eher nur zufällig. Die Umwandlung der Hex- in eine Okt-Zahl auf diese Weise ergäbe ohnehin nur Blödsinn.

Gruß, Luc :-?
Anzeige
hier eine Variante
18.11.2017 08:12:55
Tino
Hallo,
teste mal die Variante.
Sub test()
Debug.Print HexToBin("410")
Debug.Print HexToBin("5423454f4545c4")
End Sub
Function HexToBin(ByVal HexNum As String) As String
Dim i%, tmpText$, intDec%
HexNum = UCase(HexNum)
For i = 1 To Len(HexNum)
intDec = Asc(Mid$(HexNum, i, 1))
Select Case intDec
Case 48 To 57: intDec = intDec - 48
Case 65 To 70: intDec = intDec - 55
Case Else: HexToBin = "Error": Exit Function
End Select
HexToBin = HexToBin & DecToBin(intDec, 4)
Next
Do While Left$(HexToBin, 1) = "0" And Len(HexToBin) > 0
HexToBin = Right$(HexToBin, Len(HexToBin) - 1)
Loop
End Function
Function DecToBin(iChr%, bitSys%)
Dim ii%, sTmp$
Do
ii = iChr Mod 2
sTmp = ii & sTmp
iChr = iChr \ 2
Loop Until iChr = 0
DecToBin = DecToBin & Format(sTmp, String(bitSys, "0"))
End Function
Gruß Tino
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige