Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1392to1396
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

String convertieren in double

String convertieren in double
21.11.2014 22:10:05
Lorenz
Hi
ich habe einen binären Text als string, den ich jetzt in eine Double-Variable einlesen/umformen muss. Weß jemand wie das geht?
Ich versuche die Erklärung ein zweites mal:
Ein String mit 8 Charactern (siehe unten) mit jew 8 bit ergibt ja zusammen 64 bit. Das sollte ja binär gesehen in eine Double-Variable eingelesen werden können.
Sub test
dim BinTxt as string
dim x as double
BinTxt = "AIC2WVuP"
x = ?
End Sub

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: String convertieren in double
21.11.2014 23:14:32
Tino
Hallo,
müsste in etwa so gehen
Sub test()
Dim BinTxt As String, sTmp$, DecToBin$, BinToDec#
Dim i%, iChr%, ii%
Dim x As Double
BinTxt = "AIC2WVuP"
'Dez. in Bin
For i = 1 To Len(BinTxt)
iChr = Asc(Mid(BinTxt, i, 1))
Do
ii = iChr Mod 2
sTmp = ii & sTmp
iChr = iChr \ 2
Loop Until iChr = 0
DecToBin = DecToBin & Format(sTmp, "00000000")
sTmp = ""
Next i
'Bin in Dez
For i = Len(DecToBin) To 1 Step -1
If Mid(DecToBin, i, 1) = "1" Then
BinToDec = BinToDec + 2 ^ (Len(DecToBin) - i)
End If
Next i
MsgBox "Ascii: " & vbCr & BinTxt & vbCr & vbCr & _
"Binary 8Bit: " & vbCr & DecToBin & vbCr & vbCr & _
"Dez: " & vbCr & Format(BinToDec, "0")
End Sub
Gruß Tino

Anzeige
Excel/VBA ist dafür nicht geignet zu große Zahl...
22.11.2014 00:15:54
Tino
Hallo,
die Genauigkeit ist bei so großen Zahlen nicht gegeben.
Gruß Tino

Aber ansonsten stimmt dein Ergebnis, ...
22.11.2014 01:00:51
Luc:-?
…Tino,
wobei es auch sein kann, dass VBA mit so großen Zahlen zurechtkommt, nur Xl nicht. Notfalls kann er ja auch in eine Hex-Zahl umwandeln und mit anderer Software weiterarbeiten.
Hier, aufbauend auf der Bit-Folge, 2 FmlAnsätze (Kontrollweg), die zum gleichen Ergebnis kommen:
 CDEFGHIJ
1AIC2WVuP01000001010010010100001100110010010101110101011001110101010100004149433257567550
2Länge:4,7043651692579E+18 4,70437E+18 10953203701465283920
3644 704 365 169 257 900 000 4 704 365 169 257 900 00042949672961
4640100000101001001010000110011001001010111010101100111010101010000  
54,70437E+184 704 365 169 257 900 000     
6Formeln4 704 365 169 257 900 000⇒TEXT(DiSum(D4;2);"# ##0")
7D1: {=VJoin(DEZINBIN(CODE(Sprite(C1;""));8);"")}I1:J1: {=T2CharVect(WECHSELN(ConBin(D1;16);ZEICHEN(160);"");2)}
8D2: {=DiSum(D1;2)}G2:=SUMMENPRODUKT(I2:J2;I3:J3)I2[:J2]:=HEXINDEZ(I1)
9D3:=TEXT(D2;"# ##0")G3:=TEXT(G2;"# ##0")I3:=16^LÄNGE(J1)

Morrn, Luc :-?
Besser informiert mit …

Anzeige
aber das Ergebnis ist falsch...
22.11.2014 07:44:40
Tino
Hallo,
weil die Genauigkeit nur bis 10^14 geht,
beim rückrechnen kommt bei den letzten zwei Zeichen nur murks raus.
Richtig ist nur der Binar-Code!
Gruß Tino

Ja, deshalb ja 'ansonsten' u.d.Hex-Vorschlag!
22.11.2014 13:25:04
Luc:-?
:-?

Version mit Umwandlung CDec() u. Text
22.11.2014 14:11:55
Tino
Hallo,
so kann man auch größere Berechnen und komplett darstellen und auch zurückrechnen.
Option Explicit

Sub test()
Dim sBinar$, sStringAscii$, sDec$
Dim sText$

Const BitSystem% = 8

sStringAscii = "AIC2WVuP"
'sStringAscii = "1IC0WVuz" 
'sStringAscii = "zzzzzzzzzzzz" 
'sStringAscii = "Lorenz_Tino" 

sBinar = AsciiToBin(sStringAscii, BitSystem)

sDec = BinarToLongDec(sBinar)

sText = DecToAscii(sDec, BitSystem)

MsgBox "Ascii: " & vbCr & sStringAscii & vbCr & vbCr & _
       "Binary " & BitSystem & " Bit: " & vbCr & sBinar & vbCr & vbCr & _
       "Dez: " & vbCr & sDec & vbCr & vbCr & _
       "Rückwerts: " & vbCr & sText

End Sub

Function BinarToLongDec(sBinar$)
Dim i%, ii%
BinarToLongDec = "0"
For i = Len(sBinar) To 1 Step -1
    If Mid(sBinar, i, 1) = "1" Then
        BinarToLongDec = CDec(BinarToLongDec) + CDec(RechnerPotens(2, ii))
    End If
    ii = ii + 1
Next i
End Function

Function AsciiToBin(sAscii$, bitSys%)
Dim iChr%, i%, ii%, sTmp$
'Dez. in Bin 
For i = 1 To Len(sAscii)
    iChr = Asc(Mid(sAscii, i, 1))
    Do
        ii = iChr Mod 2
        sTmp = ii & sTmp
        iChr = iChr \ 2
    Loop Until iChr = 0
    AsciiToBin = AsciiToBin & Format(sTmp, String(bitSys, "0"))
    sTmp = ""
Next i
End Function

Function DecToAscii(ByVal DecBin$, bitSys) As String
Dim ii$, i%, BinToDec, sTemp$
Dim sBin$, sAscii$
Dim n%

Do
    ii = CDec(DecBin) / CDec(2)
    If InStr(ii, ",") > 0 Then ii = Left$(ii, InStr(ii, ",") - 1)
    ii = CDec(2) * CDec(ii)
    ii = CDec(DecBin) - CDec(ii)

    sBin = ii & sBin
    DecBin = CDec(DecBin) / CDec(2)
    If InStr(DecBin, ",") > 0 Then DecBin = Left$(DecBin, InStr(DecBin, ",") - 1)
Loop Until DecBin = "0"

If Len(sBin) Mod bitSys > 0 Then sBin = String(bitSys - Len(sBin) Mod bitSys, "0") & sBin
ii = 0

For i = Len(sBin) To 1 Step -1
    If Mid(sBin, i, 1) = "1" Then
        BinToDec = BinToDec + 2 ^ n
    End If
    n = n + 1
    If n Mod bitSys = 0 Or i = 1 Then
        DecToAscii = Chr(BinToDec) & DecToAscii
        BinToDec = 0
        n = 0
    End If
Next i
End Function

Function RechnerPotens(n, nn) As String
Dim nnn
If nn = 0 Then RechnerPotens = "1": Exit Function
RechnerPotens = n
For nnn = 1 To nn - 1
    RechnerPotens = CDec(RechnerPotens) * CDec(n)
Next nnn
End Function
Gruß Tino

Anzeige
AW: String convertieren in double
22.11.2014 13:16:02
Gerd
Name: Lorenz Version: 14 - Office 2010
Betreff: String convertieren in double Level: Excel gut - VBA gut
Hallo,
ich hatte gestern abend schon einen Thread dazu geöffnet (ich kann da irgendwie nicht mehr drauf antworten jetzt). Danke Tino und Luc für die Antworten. Der Code von Tino funktioniert, berücksichtigt aber das Vorzeichen nicht. Soweit ich weiß, ist ja das erste bit einer Double ein Vorzeichenbit, danach der Exponent (genaue Kodierung kenn ich leider nicht.
Darf ich nochmal erweitert fragen? Ich habe ein XML file, genauer ein mzML-file, das massenspektrometrische Daten enthält mit x/y-Daten. X sind Massen (64 bit), Y sind Intensitäten (32 bit). Die Daten sind binär kodiert in zwei Arrays (siehe unten - ich habe alle "" im Code ersetzt mit eckigen Klammern, damit das hier dargestellt wird). In fett sind die Daten kodiert. Ganz unten habe ich das rausgesucht, was hier eigentlich rauskommen muss (4 x/y-Paare) aber ich komme nicht von dem String auf die richtigen Zahlen. Hat hier eine Idee?
[binaryDataArrayList count="2"]
[binaryDataArray encodedLength="44"]
[cvParam cvRef="MS" accession="MS:1000514" name="m/z array" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" /]
[cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" /]
[cvParam cvRef="MS" accession="MS:1000576" name="no compression" /]
[binary]AAAAgMbLi0AAAABAM+OLQAAAAGCy64tAAAAAoHMjjEA=[/binary]
[/binaryDataArray]
[binaryDataArray encodedLength="24"]
[cvParam cvRef="MS" accession="MS:1000515" name="intensity array" unitAccession="MS:1000131" unitName="number of counts" unitCvRef="MS"/]
[cvParam cvRef="MS" accession="MS:1000521" name="32-bit float" /]
[cvParam cvRef="MS" accession="MS:1000576" name="no compression" /]
[binary]Wo5rQ7bvCUR6nm5DK6WIQw==[/binary]
[/binaryDataArray]
[/binaryDataArrayList]
Ergebnis, was rauskommen muss:
First array (m/z) Second array (Intensity)
889.471923828 ---- 235.556060791
892.400024414 ---- 551.745483398
893.462097168 ---- 238.619049072
900.43145752 ---- 273.290374756

Anzeige
Das ist sowohl für Tinos als auch meine AW ...
22.11.2014 13:42:29
Luc:-?
…richtig, Lorenz,
allerdings sind die Negativ-Konventionen in Xl und VBA 1. unterschiedlich und 2. komplizierter. Außerdem kann es in der EDV auch vorkommen, dass das letzte Bit das Vorzeichen-Bit ist, was unkomplizierter ist. Insofern ist deine Byte-Angabe kontraproduktiv — die Ergebnisse sollten als Hexa­dezimal­Zahl vorliegen.
Xl arbeitet bei der Konvertierung von Binär­Zahlen mit einem Block von 10 Zeichen. Bei kürzeren Angaben wdn die fehlenden ersten Bits als =0 angenommen, sie ergeben also immer eine positive Zahl. Ist das 1. von 10 vorhandenen Bits =1, ist die Zahl negativ. Negative Zahlen müssen also immer 10 Bits lang sein. Längere Bit-Folgen wdn von den Xl-Konvertierungsfktt nicht verarbeitet! In VBA ist die Blocklänge EDV-gerechter auf 8 Zeichen begrenzt. Will man anderes, muss man erst eine Regel für negative Bit-Folgen aufstellen. Gleiches gilt für Gleitkomma­Zahlen. Ich hatte schon mal eine solche Fkt pgmiert, die ist aber sehr komplex und enthält auch noch Fehler, weshalb ich die nicht zV stelle.
Gruß, Luc :-?

Anzeige
Man kann bei einer fixen Länge von 64 Bit ...
22.11.2014 14:51:23
64
…allerdings auch davon ausgehen, dass das 1.Bit darüber entscheidet, ob die Zahl posi- oder negativ ist. Das ist dann aber nicht einfach nur die Kennzeichnung des Vorzeichens, sondern die ganze Bit-Folge wird dann als posi- bzw negativ interpretiert: 1111111111 ist in Xl die Darstellung von -1, in VBA wäre das dann 11111111, was man mit entsprd Konvertierung leicht überprüfen kann.
Eine Fml mit meinem Ansatz auf Basis einer vollständigen 64-Bit-Folge könnte dann …
=DiSum(A1;2)-LINKS(A1)*2^maxBlockLänge
…lauten (maxBlockLänge hier also =64). Bei Tinos Lösung dann analog. Nur dürfte das in beiden Fällen kaum die richtige DezimalZahl ergeben (wg der eingeschränkten Xl-Genauigkeit), könnte aber möglicher­weise in eine richtige Hexadezimal­Zahl konvertiert wdn (Darstellung in VBA: &h).
Luc :-?

Anzeige
AW: Man kann bei einer fixen Länge von 64 Bit ...
22.11.2014 16:39:28
64
ok. danke für Eure Beiträge. Ich muss mal sehen, wie ich jetzt damit umgehe. Dauert wohl ein bischen.
Lorenz

Ja, Tino sagt es noch mal, ...
22.11.2014 16:44:54
Luc:-?
…Lorenz,
wir wissen nicht, wie mzML die Originaldaten codiert, deshalb können wir die auch nicht oW rückwandeln, mal abgesehen von den Xl-Einschränkungen.
Viel Glück, Luc :-?

Ansonsten, informiere dich mal darüber, ...
22.11.2014 17:20:49
Luc:-?
…Lorenz,
bspw hier. Da steht, dass es auch einen kostenfreien MS-Konverter gibt…
Luc :-?

keine Ahnung da fehlt bestimmt was?!
22.11.2014 16:37:46
Tino
Hallo,
ich denke dies ist damit nicht lösbar.
Evtl. fehlt die entsprechende Schablone um dies zu dekodieren.
Womit ich auch aus der Frage raus wäre ;-)
Gruß Tino
Anzeige

209 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige