| 

.NET C# Java Javascript Exception

3
Hallo,

ich habe von meinem Vorgänger ein VB6 Programm geerbt, dass Zahlen mit Hilfe der API 'CopyMemory' in ein BitArray schreibt.

Da ich die Routine jetzt in VB2010 umsetzen will, muss ich das erst mal verstehen.


Für "ganzzahligen Zahlen " Byte, Integer und Long verstehe ich das. Also da kann ich das nachvollziehen, was im ByteArray steht.

An einer Stelle werden aber Double Werte mit dieser Routine weggeschrieben.

dim BinFeld(0 to 100)
Dim dblWert as double
dblWert = 2147483638

CopyMemory (BinFeld(0),dblWert,8)


Dann bekomme ich im BinFeld folgendes:

BinFeld(0) = 0
BinFeld(1) = 0
BinFeld(2) = 192
BinFeld(3) = 255
BinFeld(4) = 255
BinFeld(5) = 255
BinFeld(6) = 223
BinFeld(7) = 65

Wie muß ich das interpretieren um wieder auf meine Zahl zu kommen.

Ich weis da spielen die Positive und Negative Bereich mit und die Kommas.

Danke für Eure Tipps!

hupsi
News:
26.09.2012
hupsi 201 1 7
5 Antworten
1
Dann nimms halt aus der Kernl32.dll
[DllImport("kernel32.dll", EntryPoint="RtlMoveMemory")]
static extern void CopyMemory(double[] Destination, double[] Source, uint Length);
26.09.2012
JEwen 2,7k 5
1
+1, der Legacy VB6 Code verwendet mit Sicherheit dieselbe WinAPI Funktion. Sich davon lösen zu wollen, ist aber dennoch ein verständlicher Gedanke...
ffordermaier 26.09.2012
Und wie sieht die Declaration in VB2010 aus ?
hupsi 27.09.2012
<DllImport("kernel32.dll", EntryPoint := "RtlMoveMemory")> _
Private Shared Sub CopyMemory(Destination As Double(), Source As Double(), Length As UInteger)
End Sub
JEwen 27.09.2012
0
Bei der Double-Zahl handelt es sich um 8 Bytes, die standardmäßig nach IEEE 754 verschlüsselt werden. Das bedeutet, dass Mantisse und Exponent getrennt eingetragen werden. Manche Hexeditoren können diese Bitketten direkt wieder in eine Zahl umwandeln.
Die Funktion CopyMemory kopiert offensichtlich nur diese Bitkette in den Speicher.

Zum Format kann vielleicht der Link zur Wikipedia helfen:
http://de.wikipedia.org/wiki/Gleitkommazahl
26.09.2012
edvservice 1,4k 1 6
Wenn ich das richtig verstehe, dann geht es doch um das Serialisieren und Deserialisieren von Werten. Was spricht dann dagegen, statt eines Bytestreams einen anderen Mechanismus zu verwenden, z.B. XML?
edvservice 26.09.2012
0
Was spricht gegen das zurückkopieren in eine double-Variable?

CopyMemory(dblWert, BinFeld(0), 8)

Bin kein VB-Experte, daher weiß ich nicht ob das so funktioniert oder ob die Adresse der Variablen angegeben werden muss.
26.09.2012
erh 86 1 3
0
Ich will (muss) mich von dem CopyMemory lösen, weil das in Vb2010 nicht mehr so einfach ist.
26.09.2012
hupsi 201 1 7
1
@hupsi: Bitte poste solche Anmerkungen als Kommentar zu einer Antwort, da der Thread hier nicht "as-posted" erhalten bleibt, sondern aufgrund der Bewertungen geordnet wird. Da passiert es schnell, dass Deine "Antwort"(=Anmerkung) völlig kontextfrei unter einem anderen Beitrag steht.
ffordermaier 26.09.2012
0
Ich habe das Problem gelöst. Ich habe nun eine eigene Routine in VB2010 ohne API und CopyMemeory geschrieben, welches die Werte ins ByteArray schreibt. Mit dem Wissen von Wikipedia über IEEE754 und einem Online-UmRechner war das dann auch kein Problem mehr.

Danke für Eure Tipps

hupsi
28.09.2012
hupsi 201 1 7

Stelle deine Api-Frage jetzt!