Avatar billede danm Nybegynder
16. april 2006 - 21:54 Der 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.
Avatar billede arne_v Ekspert
16. april 2006 - 22:36 #1
Koden i den her klasse kan klare det meste:

Imports System

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
Avatar billede bernhof Nybegynder
17. april 2006 - 17:33 #2
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:

    Imports System.Runtime.Serialization.Formatters.Binary


(I ovenstående svarer m_Settings til din instans af din settings-klasse)
Avatar billede arne_v Ekspert
17. april 2006 - 17:41 #3
jeg tror at vi har fortolket binaer streng lidt forskelligt

jeg har antaget at han mener 9 som "1001"
Avatar billede danm Nybegynder
19. april 2006 - 00:46 #4
Jeg det var godt nok binære tal jeg ville konvertere imellem..
Så super svar igen Arne_V.. Takker

Smid svar
Avatar billede arne_v Ekspert
19. april 2006 - 04:13 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester