/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Konvertering hex/dec og omvendt
Fra : Jette Nielsen


Dato : 26-11-00 20:23

Hej

Håber nogen vil hjælpe en newbie med et lille problem.
Jeg har på følgende måde konverteret dec til hex....

txthex1.Text = Hex(Val(txtrod.Text))
txthex2.Text = Hex(Val(txtgron.Text))
txthex3.Text = Hex(Val(txtblaa.Text))

Men hvordan gør jeg det omvendte, altså hex til dec?

På forhånd tusind tak

Mvh. Jette



 
 
Helge Bjørkhaug (26-11-2000)
Kommentar
Fra : Helge Bjørkhaug


Dato : 26-11-00 20:29

Jette Nielsen <jette-nielsen@get2net.dk> skrev i news:8vrngj$2ut6$1@news.cybercity.dk
> Hej
>
> Håber nogen vil hjælpe en newbie med et lille problem.
> Jeg har på følgende måde konverteret dec til hex....
>
> txthex1.Text = Hex(Val(txtrod.Text))
> txthex2.Text = Hex(Val(txtgron.Text))
> txthex3.Text = Hex(Val(txtblaa.Text))
>
> Men hvordan gør jeg det omvendte, altså hex til dec?
>
> På forhånd tusind tak
>

Public Function Hex2Dec(ByVal sHex As String) As Double

Dim i As Integer
Dim nDec As Double
Const HexChar As String = "0123456789ABCDEF"

For i = Len(sHex) To 1 Step -1
nDec = nDec + (InStr(1, HexChar, Mid(sHex, i, 1)) - 1) * 16 ^ (Len(sHex) - i)
Next i

Hex2Dec = CStr(nDec)
End Function

Mvh,

Helge



Jette Nielsen (26-11-2000)
Kommentar
Fra : Jette Nielsen


Dato : 26-11-00 20:57

Helge Bjørkhaug skrev:
> Public Function Hex2Dec(ByVal sHex As String) As Double
>
> Dim i As Integer
> Dim nDec As Double
> Const HexChar As String = "0123456789ABCDEF"
>
> For i = Len(sHex) To 1 Step -1
> nDec = nDec + (InStr(1, HexChar, Mid(sHex, i, 1)) - 1) * 16 ^
(Len(sHex) - i)
> Next i
>
> Hex2Dec = CStr(nDec)
> End Function

Tak Helge! Jeg ved ikke hvordan, men det virker

Mvh. Jette



Lars Hoffmann (26-11-2000)
Kommentar
Fra : Lars Hoffmann


Dato : 26-11-00 22:51

"Helge Bjørkhaug" wrote:

> Public Function Hex2Dec(ByVal sHex As String) As Double

Det kan gøres meget meget mere simpelt. På
<http://support.microsoft.com/support/kb/articles/Q161/3/04.asp> står
der:
   
The Val() function can be used to convert a string of decimal digits
into a number. It can also be used on a string of hexadecimal digits,
but you have to append the characters "&H" to the string of digits so
that the Val() function will use the correct number base in the
conversion process.

altså:

dim dectal as long

decTal=VAL("&H"+str(Hextal))

--
/Lars

A computer scientist is someone who, when told to 'Go to Hell',
sees the 'go to', rather than the destination, as harmful.

Carsten Jessen (27-11-2000)
Kommentar
Fra : Carsten Jessen


Dato : 27-11-00 10:45


Lars Hoffmann <larshoffmann@teleline.es> skrev i en
nyhedsmeddelelse:3A2185E2.F3A08DD@teleline.es...
> "Helge Bjørkhaug" wrote:
>
> > Public Function Hex2Dec(ByVal sHex As String) As Double
>
> Det kan gøres meget meget mere simpelt. På
> <http://support.microsoft.com/support/kb/articles/Q161/3/04.asp> står
> der:
>
> The Val() function can be used to convert a string of decimal digits
> into a number. It can also be used on a string of hexadecimal digits,
> but you have to append the characters "&H" to the string of digits so
> that the Val() function will use the correct number base in the
> conversion process.
>
> altså:
>
> dim dectal as long
>
> decTal=VAL("&H"+str(Hextal))
>
> --
> /Lars
>
> A computer scientist is someone who, when told to 'Go to Hell',
> sees the 'go to', rather than the destination, as harmful.

Du skal være varsom med at bruge ovenstående metode. Jeg har opdaget at
funktionen i nogle tilfælde kommer med 2-kompliment til den indtastede
streng, dvs. at funktionen retunerer et negativt tal der ikke umiddelbart
kan bruges. Jeg fandt aldrig ud af hvad det var der forårsagede problemet
men konkluderede at det højst sandsynligt var en Microsoft ting der ikke
havde nogen logisk forklaring.

MVH Carsten



Tomas Christiansen (27-11-2000)
Kommentar
Fra : Tomas Christiansen


Dato : 27-11-00 13:31

Carsten Jessen skrev:
> Du skal være varsom med at bruge ovenstående metode. Jeg har opdaget at
> funktionen i nogle tilfælde kommer med 2-kompliment til den indtastede
> streng, dvs. at funktionen retunerer et negativt tal der ikke umiddelbart
> kan bruges. Jeg fandt aldrig ud af hvad det var der forårsagede problemet
> men konkluderede at det højst sandsynligt var en Microsoft ting der ikke
> havde nogen logisk forklaring.

Der er en fuldstændig logisk forklaring. En Interger/Long ER jo
repræsenteret som et 16/32bit langt 2-komplement tal!!!

Når du forsøger at konvertere et hexadecimalt tal, som giver et
bit-bitmønster, som, når de konverteres til decimal, giver en negativ værdi,
ja så er det hvad du får.

Positive dec-værdier: &H00000000 - &H7FFFFFFF
Negative dec-værdier: &H80000000 - &HFFFFFFFF

Intet mærkeligt i det.

Du kan overbevise dig selv om det, ved at prøve:

MsgBox "Dec2Hex(-123456) = " & Hex(-123456) & _
vbNewLine & "Hex2Dec(&HFFFE1DC0) = " & Val("&HFFFE1DC0")

Men bliv nu ikke forvirret, når VB's funktion nogle gange returnerer en
Integer og nogle gange en Long (dvs. 4 eller 8 hexadecimale cifre).

-------
Tomas



Jette Nielsen (27-11-2000)
Kommentar
Fra : Jette Nielsen


Dato : 27-11-00 21:47

Lars Hoffmann skrev:
> altså:
>
> dim dectal as long
>
> decTal=VAL("&H"+str(Hextal))

Jeg håbede også der fandtes noget i den stil..... men jeg kan se på de næste
indlæg at den ikke er så sikker at bruge??

Mvh. Jette



Tomas Christiansen (27-11-2000)
Kommentar
Fra : Tomas Christiansen


Dato : 27-11-00 23:31

Jette Nielsen skrev:
> Jeg håbede også der fandtes noget i den stil..... men jeg kan se på de
næste
> indlæg at den ikke er så sikker at bruge??

Hvis du holder dig til de begrænsinger, som jeg har beskrevet er den helt
sikker.
-------
Tomas



Jette Nielsen (28-11-2000)
Kommentar
Fra : Jette Nielsen


Dato : 28-11-00 18:20

Tomas Christiansen skrev:
> Hvis du holder dig til de begrænsinger, som jeg har beskrevet er den helt
> sikker.

Ok, men nu taler I jo ikke lige frem newbie-sprog .... skal jeg forstå
det således at den er god nok at bruge sålænge beregningerne ikke indeholder
negative tal?

Mvh.
Jette



Tomas Christiansen (28-11-2000)
Kommentar
Fra : Tomas Christiansen


Dato : 28-11-00 22:23

Jette Nielsen skrev:

> Ok, men nu taler I jo ikke lige frem newbie-sprog .... skal jeg forstå
> det således at den er god nok at bruge sålænge beregningerne ikke
indeholder
> negative tal?

Du er altid velkommen til at spørge, hvis jeg udtrykker mig for kryptisk.
Jeg vil meget gerne forsøge at forklare nærmere.

....og det er godt at du spørger, for det fik mig til at undersøge sagen
nærmere!

Der ER problemer med resultatet i nogle ganske bestemte tilfælde!!!

Hermed en uforbeholden undskyldning til Carsten Jessen, idet jeg i den grad
ignorerede hans bemærkning om, at man skal være varsom med at bruge den
pågældende metode: Du HAR HELT RET Carsten.

Landet ligger således, at Val-funktionen altid returnerer et tal af typen
Double, men undervejs til mellem-resulteter, kan den åbenbart godt finde på
at bruge andre datatyper, hvilket kan give nogle meget uheldige resultater!

1. Hvis det hexadeciale tal holder sig indenfor 16 bit (dvs. 1 til 4
hexadecimale cifre), konverteres tallet internt til en Integer, og derefter
returneres en Double.
2. Hvis det hexadecimale tal er større end 16 bit men mindre end en eller
lig 32 bit (dvs. 5 til 8 hexadecimale cifre), konverteres internt til en
Long og derefter til en Double.
3. Hvis det hexadecimale tal er større end 32 bit (dvs. mere end 8
hexadecimale cifre), får man en "overflow" fejl.

Nu er problemet, at en Integer kan indeholde positive tal fra 0 til 32767,
hvilket hexadecimalt er &H0000 til &H7FFF.
Hvis man prøver at konvertere værdier fra &H8000 til &HFFFF, opfattes det
som negative tal fra -32768 til -1.

Tilsvarende gælder for Long, at de kan indeholde positive tal fra 0 til
2147483647, hvilket hexadecimalt er &H00000000 til &H7FFFFFFF.
Hvis man prøver at konvertere værdier fra &H80000000 til &HFFFFFFFF,
opfattes det som negative tal fra -2147483648 til -1.

----------------------------------------------------
Med andre ord, går følgende konverteringer godt:
&H0 - &H7FFF og &H10000 - &H7FFFFFFF

Hvorimod der kommer et negativt resultat i følgende tilfælde:
&H8000 - &HFFFF og &H80000000 - &HFFFFFFFF
----------------------------------------------------

DET ER IKKE GODT!

I mange tilfælde må man sige, at Val ikke anvendelig til at konvertere
hexadecimale tal.

Brug i stedet den metode som Helge Bjørkhaug foreslog eller noget i retning
af nedenstående forslag:

Function Hex2Dec(ByVal sHex As String) As Double
Dim i As Long
For i = 1 To Len(sHex)
Hex2Dec = 16 * Hex2Dec + Val("&H" & Mid(sHex, i, 1))
Next i
End Function

-------
Tomas



Carsten Jessen (29-11-2000)
Kommentar
Fra : Carsten Jessen


Dato : 29-11-00 16:12

Hej Thomas
Undskyldningen er modtaget, men jeg følte mig vidst ikke specielt krænket.
Jeg vidste jo jeg havde ret

MVH Carsten


Tomas Christiansen <toc@blikroer.removethis.dk> skrev i en
nyhedsmeddelelse:DmVU5.396$Ow2.7771@news.get2net.dk...
> Jette Nielsen skrev:
>
> > Ok, men nu taler I jo ikke lige frem newbie-sprog .... skal jeg
forstå
> > det således at den er god nok at bruge sålænge beregningerne ikke
> indeholder
> > negative tal?
>
> Du er altid velkommen til at spørge, hvis jeg udtrykker mig for kryptisk.
> Jeg vil meget gerne forsøge at forklare nærmere.
>
> ...og det er godt at du spørger, for det fik mig til at undersøge sagen
> nærmere!
>
> Der ER problemer med resultatet i nogle ganske bestemte tilfælde!!!
>
> Hermed en uforbeholden undskyldning til Carsten Jessen, idet jeg i den
grad
> ignorerede hans bemærkning om, at man skal være varsom med at bruge den
> pågældende metode: Du HAR HELT RET Carsten.
>
> Landet ligger således, at Val-funktionen altid returnerer et tal af typen
> Double, men undervejs til mellem-resulteter, kan den åbenbart godt finde

> at bruge andre datatyper, hvilket kan give nogle meget uheldige
resultater!
>
> 1. Hvis det hexadeciale tal holder sig indenfor 16 bit (dvs. 1 til 4
> hexadecimale cifre), konverteres tallet internt til en Integer, og
derefter
> returneres en Double.
> 2. Hvis det hexadecimale tal er større end 16 bit men mindre end en eller
> lig 32 bit (dvs. 5 til 8 hexadecimale cifre), konverteres internt til en
> Long og derefter til en Double.
> 3. Hvis det hexadecimale tal er større end 32 bit (dvs. mere end 8
> hexadecimale cifre), får man en "overflow" fejl.
>
> Nu er problemet, at en Integer kan indeholde positive tal fra 0 til 32767,
> hvilket hexadecimalt er &H0000 til &H7FFF.
> Hvis man prøver at konvertere værdier fra &H8000 til &HFFFF, opfattes det
> som negative tal fra -32768 til -1.
>
> Tilsvarende gælder for Long, at de kan indeholde positive tal fra 0 til
> 2147483647, hvilket hexadecimalt er &H00000000 til &H7FFFFFFF.
> Hvis man prøver at konvertere værdier fra &H80000000 til &HFFFFFFFF,
> opfattes det som negative tal fra -2147483648 til -1.
>
> ----------------------------------------------------
> Med andre ord, går følgende konverteringer godt:
> &H0 - &H7FFF og &H10000 - &H7FFFFFFF
>
> Hvorimod der kommer et negativt resultat i følgende tilfælde:
> &H8000 - &HFFFF og &H80000000 - &HFFFFFFFF
> ----------------------------------------------------
>
> DET ER IKKE GODT!
>
> I mange tilfælde må man sige, at Val ikke anvendelig til at konvertere
> hexadecimale tal.
>
> Brug i stedet den metode som Helge Bjørkhaug foreslog eller noget i
retning
> af nedenstående forslag:
>
> Function Hex2Dec(ByVal sHex As String) As Double
> Dim i As Long
> For i = 1 To Len(sHex)
> Hex2Dec = 16 * Hex2Dec + Val("&H" & Mid(sHex, i, 1))
> Next i
> End Function
>
> -------
> Tomas
>
>



Jette Nielsen (29-11-2000)
Kommentar
Fra : Jette Nielsen


Dato : 29-11-00 18:45

Tomas Christiansen skrev:
> Du er altid velkommen til at spørge, hvis jeg udtrykker mig for kryptisk.
> Jeg vil meget gerne forsøge at forklare nærmere.

Du er meget venlig

Jamen så kan jeg godt bruge din den korte version, for mine hexadecimale
værdier overstiger ikke to bogstaver/tal ... det er vidst det I skriver som
&H00 - &HFF

Mit lille program omhandler noget med farver, derfor ingen værdier over 255.

Er &H et udtryk der fortæller at dette er et hexadecimalt tal? eller hur?

Mvh. Jette



N/A (01-12-2000)
Kommentar
Fra : N/A


Dato : 01-12-00 20:12



N/A (01-12-2000)
Kommentar
Fra : N/A


Dato : 01-12-00 20:12



N/A (01-12-2000)
Kommentar
Fra : N/A


Dato : 01-12-00 20:12



Jette Nielsen (01-12-2000)
Kommentar
Fra : Jette Nielsen


Dato : 01-12-00 20:12

Lars Hoffmann skrev:

> det samme her, men det er nu så rart når man får noget brugbart ud af
> det.

Naturligvis .... og jeg er temmelig spændt på om mit bliver brugbart


Mvh. Jette



Tomas Christiansen (05-12-2000)
Kommentar
Fra : Tomas Christiansen


Dato : 05-12-00 22:35

Tomas Christiansen skrev:
> ----------------------------------------------------
> Med andre ord, går følgende konverteringer godt:
> &H0 - &H7FFF og &H10000 - &H7FFFFFFF
>
> Hvorimod der kommer et negativt resultat i følgende tilfælde:
> &H8000 - &HFFFF og &H80000000 - &HFFFFFFFF
> ----------------------------------------------------
....
> I mange tilfælde må man sige, at Val ikke anvendelig til at konvertere
> hexadecimale tal.

Ja, jeg må altså lige kommentere mig selv!

Meget fint, at jeg bruger min tid på at finde ud af hvad problemet med
Val-funktionen er, og konkludrer, at den ofte er ganske ubrugelig, men hvis
jeg også havde brugt min hjerne lidt, havde jeg også forsøgt at tænke lidt
videre.

Det kom jeg så pludselig til, lige for 2 minutter siden:
Hvorfor i alverden (tænkte jeg) dog spilde kræfter på at bruge Val, når den
giver problemer?
Hvorfor ikke prøve med... CLng?
....og det virker LIDT bedre:

Hvis man bruger CLng("&H" & X), hvor X er et hexadecimalt tal, gælder at
konverteringer:
- går godt, når 0 <= X <= 7FFFFFFF
- giver negativt resultat, når 80000000 <= X <= FFFFFFFF

Det er da LIDT bedre end med Val!

Hvis man skal have det sidste med, så man får det rigtige resultat i
intervallet 0 til FFFFFFFF, er man nødt til at "pakke det ind" i en
if-sætning (og her også en funktion), og man kan derved helt slippe for den
"tunge" for-løkke:

Function Hex2Dec(ByVal SHex As String) As Double
Dim Resultat As Long
Resultat = CLng("&H" & SHex)
If Resultat >= 0 Then
Hex2Dec = Resultat
Else
Hex2Dec = 2 ^ 31 + (Resultat And &H7FFFFFFF)
End If
End Function

-------
Tomas



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste