16. april 2006 - 21:54Der er
4 kommentarer og 1 løsning
lave et tal on til binær tal og som streng
Hej
Jeg skal have gemt nogle indstilninger i mit program hvor der er en masse checkbokse. For at spare plads tænkte jeg på atlave dette som en binær streng hvor jeg så kan læse de forskellige bits for derefter at have en sand eller falsk værdi. Er der en funktion hvor jeg kan lave et binært tal (som streng) om til et almideligt heltal, og omvendt også selvfølgelig.
Class MainClass Private Shared DIGITS As String = "0123456789ABCDEF" Private Shared Function FromAny(ByVal s As String, ByVal radix As Integer) As Integer Dim res As Integer = 0 Dim sa() As Char = s.ToCharArray Dim i As Integer For i = 0 To s.Length-1 res = res * radix + DIGITS.IndexOf(sa(i)) Next FromAny = res End Function Private Shared Function ToAny(ByVal i As Integer, ByVal radix As Integer) As String Dim res As String = "" Dim tmp As Integer = i While tmp > 0 res = DIGITS.ToCharArray()(tmp Mod radix) & res tmp = tmp \ radix End While ToAny = res End Function Public Shared Function FromDec(ByVal s As String) As Integer FromDec = FromAny(s, 10) End Function Public Shared Function ToDec(ByVal i As Integer) As String ToDec = ToAny(i, 10) End Function Public Shared Function FromHex(ByVal s As String) As Integer FromHex = FromAny(s, 16) End Function Public Shared Function ToHex(ByVal i As Integer) As String ToHex = ToAny(i, 16) End Function Public Shared Function FromBin(ByVal s As String) As Integer FromBin = FromAny(s, 2) End Function Public Shared Function ToBin(ByVal i As Integer) As String ToBin = ToAny(i, 2) End Function Public Shared Sub Main(ByVal args As String()) Console.WriteLine(ToBin(FromHex("FF"))) Console.WriteLine(ToBin(FromDec("11"))) End Sub End Class
Faktisk er der noget der hedder en BinaryFormatter, med hvilken du kan serilisere en hel klasse og dens egenskaber mv. til en stream (fx til en fil). Hvis du fx har en klasse, i hvilken du gemmer alle dine settings i Shared properties (eller med en Singleton-klasse - jf evt. arne_v's artikel herom) kan denne gemmes i en fil som binær data, og indlæses igen lige så let, hvis du benytter Serializable-attributten på klassen, som herunder. Det, som du i princippet gør, er at tage et snapshot af klassen, som den ser ud lige nu (dvs. member-variablernes nuværende værdier), gemmer det hele, og indlæser det igen på et senere tidspunkt.
'Din settings klasse, i hvilken dine indstillinger opbevares
<Serializable()> _ Public Class SettingsClass Private Shared m_Value1 As Boolean Private Shared m_Value2 As String 'Denne member-variabel seriliseres ikke pga. NonSerialized-attributten 'Dette kan du bruge til member variabler, som ikke behøver blive gemt i filen <NonSerialized()> Private Shared m_DontSerialize As Int32
Public Shared Property Value1 As Boolean Get Return m_Value1 End Get Set(ByVal Value As Boolean) m_Value1 = Value End Set End Property
Public Shared Property Value2 As String Get Return m_Value2 End Get Set(ByVal Value As String) m_Value2 = Value End Set End Property End Class
Et andet sted i din kode kan du så skrive din instans af klassen til en binær fil på følgende måde:
Dim lFormatter As New BinaryFormatter Dim lFileStream As New IO.FileStream("C:\settings.bin", IO.FileMode.Create) lFormatter.Serialize(lFileStream, m_Settings) lFileStream.Close()
Eller indlæse klassen fra filen:
Dim lFormatter As New BinaryFormatter Dim lFileStream As New IO.FileStream("C:\settings.bin", IO.FileMode.Open) m_Settings = CType(lFormatter.Deserialize(lFileStream), SettingsClass) lFileStream.Close()
Bemærk, at BinaryFormatter-klassen ligger i følgende namespace, som skal importeres i toppen af koden:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.