Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

String convertieren in double

Betrifft: String convertieren in double von: Lorenz
Geschrieben am: 21.11.2014 22:10:05

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

  

Betrifft: AW: String convertieren in double von: Tino
Geschrieben am: 21.11.2014 23:14:32

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


  

Betrifft: Excel/VBA ist dafür nicht geignet zu große Zahl... von: Tino
Geschrieben am: 22.11.2014 00:15:54

Hallo,
die Genauigkeit ist bei so großen Zahlen nicht gegeben.

Gruß Tino


  

Betrifft: Aber ansonsten stimmt dein Ergebnis, ... von: Luc:-?
Geschrieben am: 22.11.2014 01:00:51

…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 …


  

Betrifft: aber das Ergebnis ist falsch... von: Tino
Geschrieben am: 22.11.2014 07:44:40

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


  

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

:-?


  

Betrifft: Version mit Umwandlung CDec() u. Text von: Tino
Geschrieben am: 22.11.2014 14:11:55

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


  

Betrifft: AW: String convertieren in double von: Gerd L
Geschrieben am: 22.11.2014 13:16:02

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 "<" und ">" 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


  

Betrifft: Das ist sowohl für Tinos als auch meine AW ... von: Luc:-?
Geschrieben am: 22.11.2014 13:42:29

…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 :-?


  

Betrifft: Man kann bei einer fixen Länge von 64 Bit ... von: Luc:-?
Geschrieben am: 22.11.2014 14:51:23

…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 :-?


  

Betrifft: AW: Man kann bei einer fixen Länge von 64 Bit ... von: Lorenz
Geschrieben am: 22.11.2014 16:39:28

ok. danke für Eure Beiträge. Ich muss mal sehen, wie ich jetzt damit umgehe. Dauert wohl ein bischen.
Lorenz


  

Betrifft: Ja, Tino sagt es noch mal, ... von: Luc:-?
Geschrieben am: 22.11.2014 16:44:54

…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 :-?


  

Betrifft: Ansonsten, informiere dich mal darüber, ... von: Luc:-?
Geschrieben am: 22.11.2014 17:20:49

…Lorenz,
bspw hier. Da steht, dass es auch einen kostenfreien MS-Konverter gibt…
Luc :-?


  

Betrifft: keine Ahnung da fehlt bestimmt was?! von: Tino
Geschrieben am: 22.11.2014 16:37:46

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


 

Beiträge aus den Excel-Beispielen zum Thema "String convertieren in double"