Volledige versie bekijken : Visual Basic - Union?



ultddave
8 October 2009, 23:44
Doel:

1 variabele aanmaken (Type: Float)

En dan elke byte van deze float appart invullen.

Aangezien ik pas begonnen ben met VB.NET, ken ik alleen maar de basis functies. Maar in C en C++ kan ik Unions gebruiken om bijvoorbeeld een Integer op te splitsen in meerdere kleine variabele (van 'x' bits grootte) zodat die het geheugen delen met die integer.

Dit wil ik ook doen in VB.NET. Dus die float opsplitsen in 8 delen. (4 bytes opsplitsen in 2 nog eens. Aangezien ik gebruik maak van hexadecimale waardes die ik ga toekennen aan elk deel.)

Volgens deze site: http://www.devx.com/tips/Tip/14418

Gaat dat met de LSet functie.

Maar als ik dat opzoek op msdn: http://msdn.microsoft.com/en-us/library/w7h739yk(VS.71).aspx

"LSet Function
Returns a left-aligned string containing the specified string adjusted to the specified length.
"

Dat lijkt me niet echt hetzelfde als de union van C/C++. ;)
Dus weet iemand hoe ik dat dan wel moet doen? Of bestaat er een makkelijkere manier om dit te doen.

PS: Ik moet dit dus gebruiken om een hexadecimaal getal ("AABBCCDD" bijvoorbeeld) in een float te stoppen.

Mvg,
Dave

ultddave
8 October 2009, 23:45
De 'Hex' omzetten naar een decimaal getal werkt niet omdat een float binair anders werkt (Tekenbit, Exponent & Mantisse) om kommagetallen voor te kunnen stellen. Vandaar dat ik mezelf wat rekenwerk wou besparen. Want via die weg (zelf omzetten :P) is het nogal omslachtig vind ik.

Snakey
12 October 2009, 07:20
Memory management in VB.NET gaat automatisch, bekijk dit artikel (http://articles.techrepublic.com.com/5100-10878_11-1049897.html) misschien eens over de werking van VB.NET.
Sterker nog, VB.NET laat je niet echt toe om zelf het geheugen te beheren.
Er bestaan wel klasses om gemakkelijk je String (met een hex in) te laten converteren naar een Long, een vb (gevonden op het internet, niet zelf uitgetest, maar code lijkt op eerste zicht ok):

Private Function ConvertHexToSingle(ByVal hexValue As String) As Single
Try
Dim iInputIndex As Integer = 0
Dim iOutputIndex As Integer = 0
Dim bArray(3) As Byte

For iInputIndex = 0 To hexValue.Length - 1 Step 2
bArray(iOutputIndex) = Byte.Parse(hexValue.Chars(iInputIndex) & hexValue.Chars(iInputIndex + 1), Globalization.NumberStyles.HexNumber)
iOutputIndex += 1
Next

Array.Reverse(bArray)

Return BitConverter.ToSingle(bArray, 0)
Catch ex As Exception
Throw New FormatException("The supplied hex value is either empty or in an incorrect format. Use the following format: 00000000", ex)
End Try

End Function

ultddave
12 October 2009, 10:29
Wel een interessant artikel. Bedankt! ;)

Ik zal de code straks uittesten. :D

Het lijkt er inderdaad op dat het zou moeten werken.

Mvg,
Dave

ultddave
12 October 2009, 21:02
Even getest. Het werkt goed! ;) nogmaals bedankt :D.

Mvg,
Dave