Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1112to1116
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

VBA Bin2Hex

VBA Bin2Hex
ChristianM
Hallo zusammen,
ich frage mich grade, wie man eine beliebig lange Binär-Zahl in Hex umwandeln kann.
Nach meinem Verständnis werden jeweils 4 Bit des Binär-Strings (von rechts) betrachtet und diese nach Hex umgerechnet.
Die Excel-Funktion BININHEX bricht bei 9 Bit ab, bzw. bringt im Vergleich zum Windows-Calculator falsche Ergebnisse
Im Netz habe ich unter:
http://www.visualbasic.happycodings.com/Applications-VBA/code4.html
die Funktion "BinToHex" gefunden. (hier ohne Fehlerabfangung)

Function BinToHex(BinNum As String) As String
Dim BinLen As Integer, i As Integer
Dim HexNum As Variant
BinLen = Len(BinNum)
For i = BinLen To 1 Step -1
If Mid(BinNum, i, 1) And 1 Then
HexNum = HexNum + 2 ^ Abs(i - BinLen)
End If
Next i
BinToHex = HEX(HexNum)
End Function
Diese kommt mit Zeichenlängen bis 31 zurecht.
ich habe mit folgendem Code versucht, das Limit aufzuheben

Function Bin2Hex(strBinary As String) As String
Dim strBin As String, strHex As String, strTmp As String
Dim bytDec As Byte, i As Integer
strBin = strBinary
Do While Len(strBin)
bytDec = 0
If Len(strBin) > 4 Then
strTmp = Right(strBin, 4)
strBin = Left(strBin, Len(strBin) - 4)
Else
strTmp = strBin
strBin = ""
End If
For i = Len(strTmp) To 1 Step -1
bytDec = bytDec + CByte(Mid(strTmp, i, 1)) * 2 ^ (Len(strTmp) - i)
Next
strHex = HEX(bytDec) & strHex
Loop
Bin2Hex = strHex
End Function
Da ich nicht grade der Hex-Experte bin frage ich mich, ob ich dabei nicht über's Ziel hinaus schieße
Meine Fragen:
- ist die Vorgehensweise richtig (und sinnvoll)?
- kann man den Code evtl. optimieren, sprich kann man auf den Zwischenschritt - Umrechnung nach Dezimal - verzichten?
Als Anlage eine Exceldatei die die genannten Limits veranschaulicht.
https://www.herber.de/bbs/user/65641.xls
vielen Dank vorab an alle VBA- und Hex-Experten
Christian

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA Bin2Hex
06.11.2009 22:18:55
OttoH
Hallo Christian,
wenn Du in der VBA -Umgebung unter Verweise den Eintrag atpvbaen aktivierts ( das ist das Analys-AddIn ), kann st Du mit hexwert=bin2hex(binwert) die Binärwerte in Hexadezimalwerte umrechnen.
Gruß OttoH
AW: VBA Bin2Hex
06.11.2009 22:25:31
OttoH
vergiss es...bricht ab
Gruß OttoH
AW: VBA Bin2Hex
06.11.2009 22:40:57
ChristianM
Danke Otto,
ich habe im VBE kein "atpvbaen" unter Verweise (wie lautet der komplette Name?)
Ich möchte aber auch nicht auf Verweise zurückgreifen, sondern das Thema einfach per VBA erschlagen.
btw: die Limits von "BININHEX" habe ich in meiner Frage ja schon aufgezeigt.
Frage ist: bin ich mit meinem Ansatz auf dem Holzweg und wenn nein, kann man diesen optimieren?
Frage noch offen
Gruß
Christian
Anzeige
VBA Bin2Hex
07.11.2009 01:03:45
Erich
Hi Christian,
noch kaum getestet, könnte aber funzen - auch für seeeeeehr große Zahlen (Texte):

Sub bb()
MsgBox Bin2HexN("111111111111111111111111111111111111111111111111111")
End Sub
Function Bin2HexN(strB As String) As String
Dim strBin As String, strHex As String, strT As String
Dim bytDec As Byte, ii As Integer, jj As Integer
jj = Len(strB) Mod 4
If jj > 0 Then
strT = Right("00" & Left(strB, jj), 3)
Bin2HexN = Hex(4 * Mid(strT, 1, 1) + 2 * Mid(strT, 2, 1) + Mid(strT, 3, 1))
End If
For ii = 0 To Int(Len(strB) / 4) - 1
Bin2HexN = Bin2HexN & Hex(8 * Mid(strB, 4 * ii + jj + 1, 1) _
+ 4 * Mid(strB, 4 * ii + jj + 2, 1) _
+ 2 * Mid(strB, 4 * ii + jj + 3, 1) _
+ Mid(strB, 4 * ii + jj + 4, 1))
Next ii
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Da stehen wohl die technischen Fktt drin,...
07.11.2009 03:22:39
Luc:-?
...die auch BIN2HEX enthalten, Christian,
nutzt dir aber nichts (s. Ottos Nachtrag). Natürlich kann man das so machen, kommt ganz darauf an, was erreicht wdn soll. Ich habe auch schon Etliches in der Richtung gesehen, auch mit Fmln (könnte auch auf excelformeln.de was stehen). BIN2HEX wird aber wohl stets ein anderes Ergebnis liefern, weil hier negative Zahlen mitberücksichtigt wdn. Deshalb auch die Beschränkung auf eine bestimmte Stellenzahl. Das gilt auch für die anderen KonvertFktt! Meine Konvert-udFkt arbeitet auch ungefähr so, aber ggf auch noch anders, denn es gibt ja neben positiv/negativ auch noch andere Zahlsysteme. Wenn man bspw Dezimalzahlen konvertieren will, könnten neben Dezimalen auch noch die beiden unterschiedl KonvertMethoden berücksichtigt wdn — bei Binärzahlen ist das natürlich schnurz, nur die Verschlüsselung von Negativwerten könnte/sollte eine Rolle spielen, wenn man mit xlFktt vgl will.
Gruß+schöWE, Luc :-?
Anzeige
AW: Da stehen wohl die technischen Fktt drin,...
07.11.2009 12:33:11
OttoH
Hallo Leute,
was haltet ihr denn davon?
Public Function BininHex(Binwert)
Dim i As Long
Dim j As Long
Dim Help As String
' erstmal wird der Binwert auf eine durch 4 teilbare Länge gebracht
i = 4 - Len(Binwert) Mod 4
Binwert = String(i, "0") & Binwert
' jetzt kann man den String von hinten in Vierer-Pakete zerlegen, diese einzeln in Hex  _
umwandeln
' und hintereinanderhängen
i = 0
For j = Len(Binwert) - 3 To 1 Step -4
Help = bin2hex(Mid(Binwert, j, 4))
i = i + 1
BininHex = Help & BininHex
Next
End Function

Gruß OttoH
Das wird mit dieser Fkt evtl nicht richtig,...
07.11.2009 13:11:35
Luc:-?
...weil die wie schon gesagt auch negative Binärzahlen konvertiert, Otto,
die dann eine bestimmte Länge (wohl 10) haben und mit 1 beginnen müssen. Kürzere Binärzahlen wdn als mit 0 beginnend und damit als positiv interpretiert, deshalb könnte es mit 4 Ziffern wohl klappen.
Intern scheint übrigens in diesem AddIn eine spezielle vbFkt namens Convert benutzt zu wdn, die sonst in VBA fehlt.
Teste deine Ergebnisse auch mal mit HEXINDEZ bzw die Basis mit BININDEZ...!
Gruß Luc :-?
Anzeige
AW: Nachtrag
07.11.2009 12:34:43
OttoH
ATVBAEN.XLS muss eingeschaltet sein.
Über AddIns die Analysefunktionen VBA aktivieren
unter Verweise den ATPVBAEN.XLA aktivieren
Gruß OttoH
AW: Nachtrag
07.11.2009 12:49:53
ChristianM
Hallo Otto,
ja, die Idee mit der String-Funktion hatte ich auch grade bei dem Code von Erich.
Aber ich möchte keine Verweise setzen - wegen Kompatibilität und alles.
Insofern finde ich den Weg mit der Hex-Funktion besser.
vielen Dank
Grüße
Christian
AW: Da stehen wohl die technischen Fktt drin,...
07.11.2009 14:28:38
ChristianM
Danke Luc,
an negative Zahlen habe ich an der Stelle noch gar nicht gedacht. Mit deiner Erklärung ist mir jetzt auch klar, warum die interne Fkt bei 9 Stellen abbricht.
Negative Zahlen kommen in meinem konkreten Fall jedoch nicht vor. Daher bin ich mit dem Ansatz (s. meine Antwort an Erich) ganz zufrieden.
Grüße
Christian
Anzeige
Na dann alles Gute + viel Spaß! Übrigens...
08.11.2009 16:50:44
Luc:-?
...muss das von mir genannte Convert woanders her sein, in aptvbaen.xls steht nur das gewöhnl für die ME-Konvertierung. Ich suche das andere schon seit Monaten/Jahren... Aber nun ist's eh' wurscht, ich hab's anders gelöst...
Meine eigene Universal-Konvertierungs-udFkt kann ich dir leider nicht anbieten, die ist mit z.Z. 589 Zeilen in Vs2.3 sicher viel zu lang - außerdem ist die Vs2.4 schon seit geraumer Zeit in Arbeit... Und Selbermachen macht ja bekanntlich auch mehr Spaß... ;-)
Gruß+schöRestSo, Luc :-?
AW: VBA Bin2Hex
07.11.2009 12:53:56
ChristianM
Hallo Erich,
vielen Dank.
zunächst die Länge des Binär-Strings zu beachten ist ne gute Idee.
ich hab deinen Code noch etwas umgebaut. OttoH hatte hier die gleiche Idee mit der String- _ Funktion.

Function Bin2HexN(strBin As String) As String
Dim strHex As String, intCnt As Integer, i As Integer
intCnt = Len(strBin) Mod 4
If intCnt > 0 Then strBin = String(4 - intCnt, "0") & strBin
For i = 1 To Len(strBin) Step 4
strHex = strHex & HEX( _
8 * Mid(strBin, i, 1) + 4 * Mid(strBin, i + 1, 1) + _
2 * Mid(strBin, i + 2, 1) + Mid(strBin, i + 3, 1))
Next
Bin2HexN = strHex
End Function

Grüße
Christian
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige