[C#] talstelsels omzetten

Pagina: 1
Acties:
  • 1.161 views sinds 30-01-2008
  • Reageer

  • decramy
  • Registratie: December 2001
  • Laatst online: 23:05

decramy

root@birdie:~#

Topicstarter
Hoe kun je in een C# prgramma een variable omzetten naar andere talstelsels?

Ik denk dat het het makkelijkst is wanneer ik bij het omzetten eerst naar 1 hoofd talstelsel ga (bin?) en daarna naar de uiteindelijke...

Ook zit ik met het probleem dat ik een string als variable heb, omdat er anders geen Hex in kan...

met Int32.Parse() zet je een string om in een integer, maar door die letters kan dat niet...

Help??

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-12 07:42

Janoz

Moderator Devschuur®

!litemod

Een getal is een getal. Of je nu het ene getal bij het andere getal optelt in hex of binair, er komt nog steeds hetzelfde uit. Het niet in hex kunnen opslaan is onzin. Intern is het zelf binair opgeslagen! Het rekenen mbv talstelsel is alleen nodig bij het invoeren van getallen en het afdrukken van getallen. Daarbij is het trouwens onzin om eerst naar binair te gaan. Er is namelijk een heel simpel algoritme dat van het ene naar het andere gaat.

Het lijkt me trouwens vreemd waneer het bij de Int32.Parse methode niet mogenlijk is om ook een base op te geven. Bij java's Integer.parseInt is dat bijvoorbeeld wel zo.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • SlowMeDown
  • Registratie: Mei 2003
  • Laatst online: 24-01-2023
Een paar voorbeelden:

// decimale string naar int
int i1 = Int32.Parse("123");
MessageBox.Show(i1.ToString());

// hex string naar int
int i2 = Convert.ToInt32("FF", 16);
MessageBox.Show(i2.ToString());

// int naar hex
int i3 = 255;
string hex = i3.ToString("x");
MessageBox.Show(hex);

Misschien heb je hier iets aan?

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Zoek maar even naar de Convert- of de Int32Converter class, en dan met name de NumberFormatInfo die je bijvoorbeeld aan Convert.ToDecimal() kan meegeven.

Voor idiote talstelsels (septaal, ik verzin maar wat) kan je natuurlijk ook zelf even wat coden. Getal delen door base, rest opschrijven, herhaal tot getalletje nul, je kent het wel :)


Journalism is printing what someone else does not want printed; everything else is public relations.


  • decramy
  • Registratie: December 2001
  • Laatst online: 23:05

decramy

root@birdie:~#

Topicstarter
Huh? Delen, rest weer delen??

Xplain...

Stel je hebt decimaal getal 456, je wilt binair...

456/2 = 228 rest 0
228/2 = 114 rest 0
114/2 = 57 rest 0
57/2 = 28 rest 1
28/2 = 14 rest 0
14/2 = 7 rest 0
7/2 = 3 rest 1
3/2 = 1 rest 1
1/2 = 0 rest 1

hee.... Wist k helemaal niet :)

Maar hoe doe je dat dan met HEX??
Ik wil 34B naar Dec hebben...
34B / 10 = ?? rest ??

[ Voor 93% gewijzigd door decramy op 14-01-2004 15:45 ]

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-12 07:42

Janoz

Moderator Devschuur®

!litemod

decramy schreef op 14 januari 2004 @ 15:40:

Maar hoe doe je dat dan met HEX??
Ik wil 34B naar Dec hebben...
34B / 10 = ?? rest ??
Bij binair (2-tallig) deel je door 2. Waar zou je door moeten delen bij hexadecimaal (16-tallig)?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

decramy schreef op 14 januari 2004 @ 15:40:
Huh? Delen, rest weer delen??

Xplain...

Stel je hebt decimaal getal 456, je wilt binair...

456/2 = 228 rest 0
228/2 = 114 rest 0
114/2 = 57 rest 0
57/2 = 28 rest 1
28/2 = 14 rest 0
14/2 = 7 rest 0
7/2 = 3 rest 1
3/2 = 1 rest 1
1/2 = 0 rest 1

hee.... Wist k helemaal niet :)

Maar hoe doe je dat dan met HEX??
Ik wil 34B naar Dec hebben...
34B / 10 = ?? rest ??
Niet 0x34B / 0x10 maar 0x34B / 0xA.
Dus:
0x34B / 0xA = 0x54 r 0x3
0x54 / 0xA = 0x8 r 0x4
0x8 / 0xA = 0x0 r 0x8
Uitkomst: 843 decimaal

[ Voor 13% gewijzigd door Verwijderd op 14-01-2004 15:54 . Reden: Duidelijk gemaakt dat het om hex. gaat i.p.v. decimaal ]


  • decramy
  • Registratie: December 2001
  • Laatst online: 23:05

decramy

root@birdie:~#

Topicstarter
Janoz schreef op 14 januari 2004 @ 15:47:
[...]


Bij binair (2-tallig) deel je door 2. Waar zou je door moeten delen bij hexadecimaal (16-tallig)?
Ja, maar hoe wil je C# wijs maken dat het getalletje B ook een getal is?

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • sphere
  • Registratie: Juli 2003
  • Laatst online: 22:49

sphere

Debian abuser

decramy schreef op 14 januari 2004 @ 15:49:
[...]

Ja, maar hoe wil je C# wijs maken dat het getalletje B ook een getal is?
B is geen getal, 0xB wel

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Janoz schreef op 14 januari 2004 @ 14:33:
Een getal is een getal. Of je nu het ene getal bij het andere getal optelt in hex of binair, er komt nog steeds hetzelfde uit. Het niet in hex kunnen opslaan is onzin. Intern is het zelf binair opgeslagen! Het rekenen mbv talstelsel is alleen nodig bij het invoeren van getallen en het afdrukken van getallen. Daarbij is het trouwens onzin om eerst naar binair te gaan. Er is namelijk een heel simpel algoritme dat van het ene naar het andere gaat.

Het lijkt me trouwens vreemd waneer het bij de Int32.Parse methode niet mogenlijk is om ook een base op te geven. Bij java's Integer.parseInt is dat bijvoorbeeld wel zo.
Zie ook RobIII in "Evaluatie: wat mis je in software voor p..." en verder (draad gaat compleet ergens anders over, maar is hiet wel van toepassing denk ik... :P )

Verder is het conversie algoritme dec->baseN->dec supersimpel. Hier een VB6 voorbeeldje dat ik een tijdje geleden eens heb gemaakt:

Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Option Explicit

Private Const BASENUMBERS As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Public Function CnvDec2BaseN(ByVal dValue As Double, Optional ByVal byBase As Byte = 16) As String
' =====================================================================================
' ===                                                    Comments by CommentMaker   ===
' =====================================================================================
'
' Functie     : CnvDec2BaseN
' Datum/Tijd  : maandag 28-aug-2000 / 12:47
' Door        : Rob
'
' Versie      : 1.0
'
' Omschrijving:
'
' Converteert een getal uit het decimaal stelsel naar een getal uit het (BASE)
' stelsel. Gebruik bijvoorbeeld Base 2 voor Binair, of Base 8 voor Octaal. Base 16
' (Hexadecimaal) is default). Minimum base is 2, maximum is 36. Negatieve getallen
' worden positief! (Dit is GEEN BUG).
'
'
' Parameters  :
'
'   dValue              - [Verplicht] Double          Waarde te converteren
'   byBase              - [Optioneel] Byte            Talstelsel
'
' Return      : String
'
' Revisies    :
'
' =====================================================================================
' ===                                                    Comments by CommentMaker   ===
' =====================================================================================
    
    
    Dim sResult As String
    Dim dRemainder As Double
    
    On Error GoTo ErrorHandler
    
    sResult = ""
    If (byBase < 2) Or (byBase > 36) Then
        CnvDec2BaseN = sResult
        Exit Function
    End If
    
    dValue = Abs(dValue)
    
    Do
        dRemainder = dValue - (byBase * Int((dValue / byBase)))
        sResult = Mid$(BASENUMBERS, dRemainder + 1, 1) & sResult
        dValue = Int(dValue / byBase)
    Loop While (dValue > 0)

    CnvDec2BaseN = sResult
    Exit Function

ErrorHandler:
    Err.Raise Err.Number, "CnvDec2BaseN", Err.Description
End Function


Public Function CnvBaseN2Dec(ByVal sValue As String, Optional ByVal byBase As Byte = 16) As Double
' =====================================================================================
' ===                                                    Comments by CommentMaker   ===
' =====================================================================================
'
' Functie     : CnvDec2BaseN
' Datum/Tijd  : maandag 12-mei-2003 / 16:41
' Door        : Rob
'
' Versie      : 1.0
'
' Omschrijving:
'
' Converteert een getal uit het (BASE) stelsel naar een getal uit het decimaal
' stelsel. Gebruik bijvoorbeeld Base 2 voor Binair, of Base 8 voor Octaal. Base 16
' (Hexadecimaal) is default). Minimum base is 2, maximum is 36. Negatieve getallen
' worden positief! (Dit is GEEN BUG).
'
'
' Parameters  :
'
'   sValue              - [Verplicht] String          Waarde te converteren
'   byBase              - [Optioneel] Byte            Talstelsel
'
' Return      : Double
'
' Revisies    :
'
' =====================================================================================
' ===                                                    Comments by CommentMaker   ===
' =====================================================================================
    Dim dValue As Double
    Dim T As Integer
    
    On Error GoTo ErrorHandler
    
    If (byBase < 2) Or (byBase > 36) Then
        CnvBaseN2Dec = 0
        Exit Function
    End If
    
    dValue = 0
    For T = Len(sValue) To 1 Step -1
      dValue = dValue + ((InStr(BASENUMBERS, Mid$(sValue, T, 1)) - 1) * (byBase ^ (Len(sValue) - (T))))
    Next
    CnvBaseN2Dec = dValue
    Exit Function

ErrorHandler:
    Err.Raise Err.Number, "CnvBaseN2Dec", Err.Description
End Function


Schrik niet van de "lap code", het meeste is comments ;)

En dit kan nog mooier/sneller/simpeler met een meer algemeen algoritme, maar die zijn zat @internet te vinden... en vast ook voor C#

[ Voor 6% gewijzigd door RobIII op 14-01-2004 16:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • decramy
  • Registratie: December 2001
  • Laatst online: 23:05

decramy

root@birdie:~#

Topicstarter
Kijk, ik wil in Visual C#.net een converter maken van de verschillende tallenstelsels.

Nu heb ik een Textbox (string) die ik doormiddel van Radiobuttons om wil zetten.
ik heb dit:
C#:
1
2
3
this.radioHex.Leave += new System.EventHandler(this.radioHex_CheckedLeave);

this.radioOct.CheckedChanged += new System.EventHandler(this.radioOct_CheckedChanged);

Ik wil nu dus in this.radioHex_CheckedLeave de huidige stand van zaken in this.Textbox.Text omzetten in het decimale talstelsel en weer in this.Textbox.Text stoppen. Daarna wil ik bij this.radioOct_CheckedChanged de decimale waarde uit this.Textbox.Text omzetten in Oct, en weer in this.Textbox.Text zetten...

Maar het lukt me gewoon niet... Geef me es een hint...

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is vrij simpel. Je moet eerst gewoon de goede methode van de Convert class gebruiken om het naar een integer/andere numerieke waarde om te zetten. Daarna kan je het met de verschillende versies van de ToString van een integer weer omzetten naar de gewenste textuele representatie.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • decramy
  • Registratie: December 2001
  • Laatst online: 23:05

decramy

root@birdie:~#

Topicstarter
En nog steeds snap ik dan niet hoe ik van Hex naar Dec ga of van Dec naar Hex...

en omzetten van oct naar bin gaat:
C#:
1
2
3
4
5
6
7
8
9
10
11
int begin, rest, eind;
string s = "";
eind = Convert.ToInt32(this.textBox.Text);
while(eind != 0)
{
    begin = eind;
    rest = begin | 8;
    eind = begin / 8;
    s = s + Convert.ToString(rest); 
}
this.textBox.Text = s;

en dec naar bin moet je de 8 vervangen door 10...
Volgens mij komt het te dagen...

Alleen nu weer andersom... Van bin naar hex/dec/oct...
En nog steeds van Hex naar Bin...


Waar staan dit soort dingen uitgelegd?? Bij PHP heb je een goede documentatie op php.net. Heb je voor C# ook zoiets??

[ Voor 98% gewijzigd door decramy op 15-01-2004 09:01 ]

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Bij C# heb je de MSDN collection. Deze is zowel online te vinden als in cd vorm. De versie van april 2003 is ook ergens te downloaden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Acheron
  • Registratie: September 2002
  • Laatst online: 11-12 20:46

Acheron

updatepack.nl

Voor decimaal naar binair en andersom
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
HP38AscD 16 Binaire Getallen1\|>A:
0\|>B:
0\|>C:
0\|>D:
CHOOSE A;"Methode";"Binair\->Decimaal";"Decimaal\->Binair":
CASE
IF A==1 THEN
INPUT B;"Binaire Getallen";"Binair";"Voer Binair getal in";0:
DO
B/10\|>B:
IF TRUNCATE(FRAC(B),1)*10==1 THEN (2^C)+D\|>D:
END:
C+1\|>C:
UNTIL INT(B)==0 END:
ERASE:
DISP 3;"    "D:
FREEZE:
END
IF A==2 THEN INPUT B;"Decimale Getallen";"Decimaal";"Voer Decimaal getal in";0:
DO IF FRAC(B/2)\=/0 THEN (1*(10^C))+D\|>D:
(B-1)/2\|>B:
IF B==0 THEN BREAK END:
C+1\|>C:
END:
IF FRAC(B/2)==0 THEN B/2\|>B:
C+1\|>C:
END:
UNTIL B==0 END:
ERASE:
DISP 3;"    "D:
FREEZE:
END
END:

Zeg nee tegen bloatware. Download Nero Lite!

Pagina: 1