Toon posts:

[VB] Hexadecimaal naar een Long value

Pagina: 1
Acties:

Verwijderd

Topicstarter
Nou da's de vraag, hoe pak ik dit aan? Hoe converteer ik bijvoorbeeld (hex) #000080 naar een (long) value?

Verwijderd

Nou ken ik VB niet, maar ik denk dat er wel een functie als value = hextoint(hex_getal) standaard is meegeleverd.

Anders kan je natuurlijk altijd zelf ff zo'n functie in elkaar klussen:
code:
1
2
3
dec_getal = (hex[0] * 16^0) + (hex[1] * 16^1) + ... + (hex[n-1] * 16^(n-1)) + (hex[n] * 16^n);

// Let op: Het 0-de element is het minst significante (meest rechtse) element van het hex getal. We tellen dus van rechts naar links!!!

Verwijderd

Topicstarter
Sorry, maar het lukt niet echt met de code hierboven, en ik vat em ook niet helemaal...
Dankjewel anyways

help still needed here :)

Verwijderd

De code slaat waarschijnlijk ook nergens op, maar als je zo een idee krijgt hoe het hex-getal in elkaar zet kan je met een beetje kennis van VB denk ik wel zelf een functie in elkaar zetten.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19-09 17:21
algemeen:
je hebt het waarschijnlijk als een stuk tekst?
Dan kan je dat heel simpel doen door bij het eerste karacter (na de #) te beginnen en te kijken of het een [0-9] of [A-F] is en de daarbij behorende waarde van [0-15] toe te voegen aan de long (die initieel nul is). Vervolgens ga je naar het volgende karakter, maar eerst vermenigvuldig je de long nog met 16 en daarna tel je daarna weer de overeenkomsige waarde in [0-15] er weer bij op. enz.

Een voorbeeld in C:
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
unsigned long int hex_to_ulong(const char *const text)
{
    unsigned long result = 0; /* begin bij 0 */
    const char     *ptr;
    register char   c;

    /* ptr is een pointer die straks alle letter af gaat */
    ptr = (const char *) text;
    if (ptr[0] != '#') /* miereneukmode: == (*ptr != '#') */
      return 0; /* geen hexadecimaal getal */

    /* ga naar de volgende letter */
    ptr++;

    for(;;)
    {
      /* sla de huidige letter op in c en laat de pointer naar de volgende letter wijzen */
      c = *ptr++;

      /* vermedigvuldig result met 16 */
      result <<= 3;

      if (c >= '0' && c <= '9')
        result += c-'0'; /* truuckje in c, haal ascii waarde van c (dat in ['0'-'9'] zit) van de ascii waarde van '0' af, dat is dan het werkelijke nummer */
      else if (c >= 'A' && c <= 'F')
        result += 10 + c-'A'; /* zelfde truucje weer, let wel op de 10 */
      else
        break; /* string bevat geen ascii letters in de vorm van getallen meer */
    }

    return result;
}

Het is niet getest, en waarschijnlijk lelijke code, maar misschien dat je er wat aan hebt.

edit:
Damn, tik je een keer je berichtje offline is in de tussentijd iemand je al voor ;)


Waar zijn trouwens de mensen op de VB en C code te benchmarken? Een assembler versie is er ook nog niet :Y)

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Topicstarter
Ja ik vind het wel leuk dat er allemaal code wordt ingestuurd, maar ff 2 dingen:

1.) Ik ben geen wiskunde wizzard
2.) Als je code hebt, stuur het dan in VB formaat

Danku, danku, danku :)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Het is geen VB maar wel ASP/VBSCRIPT

Dus hier moet je het zeker mee kunnen.....

Function HexToDecimal(pValue)

pValue=lcase(pValue)
For C = Len(pValue) To 1 Step -1
a=Mid(pValue, C, 1)
if isnumeric(a) then
CharVal = CInt(a)
else
CharVal = Asc(a) - 55
end if
Value = Value + ((16 ^ PosValue) * CharVal)
PosValue = PosValue + 1
Next

HexToDecimal = Value
End Function


Let op hij controleert niet of de waarde geldig is....

g = 17 :o

Programmer - an organism that turns coffee into software.


Verwijderd

WHoei!! niet zo moeilijk allemaal zeg!
code:
1
LngHex = "&H" & strHex

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 21-09 09:50

johnwoo

3S-GTE

Op maandag 24 september 2001 23:59 schreef Yarvieh het volgende:
WHoei!! niet zo moeilijk allemaal zeg!
code:
1
LngHex = "&H" & strHex
OK, VB cast em dan misschien wel automagisch, maar voor de netheid nog ff een Val() eromheen he ;)
code:
1
2
3
Dim DecVal As Long, HexVal As String

DecVal = Val("&H" & HexVal)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Val retouneerd een double dus nu krijgen we een cast van

string->double->long

en we hadden een cast van

string->long

Nu mag jij zeggen wat netter is >:)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op dinsdag 25 september 2001 00:11 schreef Yarvieh het volgende:
Nu mag jij zeggen wat netter is >:)
lngHex=Clng("&h" & strHex) :?

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Gerco gaat door voor de kewlkast! *D

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op dinsdag 25 september 2001 00:24 schreef Yarvieh het volgende:
Gerco gaat door voor de kewlkast! *D
8-) Het is ook een string -> long cast, maar dan een explicite, die ook een error geeft als de string GEEN long is, ipv gewoon '0' te returnen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Op dinsdag 25 september 2001 08:42 schreef Gerco het volgende:
8-) Het is ook een string -> long cast, maar dan een explicite, die ook een error geeft als de string GEEN long is, ipv gewoon '0' te returnen.
Als de string geen long is? :? Das like alitjd toch? je bedoeld waarschijnlijk als "&h" & strhex niet naar een long te evalueren is? maar zowel met als zonder expliciete cast geeft ie 'n type mismatch error dan (zonder explicite cast roept ie immers nog steeds die zelfde cast routine aan om een string naar een long te krijgen)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op dinsdag 25 september 2001 08:57 schreef Yarvieh het volgende:
Als de string geen long is? Das like alitjd toch? je bedoeld waarschijnlijk als "&h" & strhex niet naar een long te evalueren is? ... maar zowel met als zonder expliciete cast geeft ie 'n type mismatch error dan
Ja, dat bedoel ik inderdaad, klein foutje in mn uitdrukking, daar ben ik vaker niet zo goed in :)

Nee, dan geeft 'ie 0, probeer maar debug.print val("blaat") en debug.print clng("blaat"), CLng() geeft een error, Val() geeft '0' (8>

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Misschien zie ik het verkeerd maar..

zonder cast: lngHex = "&h" & strHex

Met cast : lngHex = val( "&h" & strHex) , lngHex = clng( "&h" & strHex)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op dinsdag 25 september 2001 10:06 schreef Yarvieh het volgende:
Misschien zie ik het verkeerd maar..
Misschien begrijp ik je verkeerd, ik bedoel:
code:
1
2
3
4
5
6
7
dim lngHex as Long
dim strHex as String
strHex = "&H" & "blaat"

lngHex = strHex      ' Geeft 0
lngHex = val(strHex)    ' Geeft 0
lngHex = clng(strHex)     ' Geeft Type mismatch

Dat bedoel ik, maar als je er natuurlijk een goede "&hFF" ofzo instopt, werken ze allemaal even goed, maar toch vind ik de laatste netter, explicite cast MET error als je er een verkeerde waarde inpropt.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

code:
1
lngHex = strHex      ' Geeft 0

Incorrect geeft type mismatch.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 21-09 09:50

johnwoo

3S-GTE

Op dinsdag 25 september 2001 00:11 schreef Yarvieh het volgende:
Val retouneerd een double dus nu krijgen we een cast van

string->double->long

en we hadden een cast van

string->long

Nu mag jij zeggen wat netter is >:)
Val geeft geen double, Val kijkt welk type verwacht wordt :P
MSDN zegt:
Val Function

Returns the numbers contained in a string as a numeric value of appropriate type.

[...]

Remarks

The Val function stops reading the string at the first character it can't recognize as part of a number.
Dus ja :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Op dinsdag 25 september 2001 11:57 schreef johnwoo het volgende:
Val geeft geen double, Val kijkt welk type verwacht wordt :P
Open vb es en typ val( dan krijg je een popupje
"Val(String as String) as Double"

Mocht je nog niet overtuigd zijn doe dan 'n
msgbox typename(val("1234"))

Whoeii weer een double..

Goed omdat vb ook wel snapt dat ie geen double in een long kwijt kan zal ie 'm alsnog voor je naar long casten maar dat is niet het werk van val da doet de vb runtime voor je.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op dinsdag 25 september 2001 10:58 schreef Yarvieh het volgende:
code:
1
lngHex = strHex      ' Geeft 0

Incorrect geeft type mismatch.
Nou ja, mijn fout. Maar toch vind ik het netter om CLng() te gebruiken, bij wijze van expliciete cast. Maar ik ben er zoeen die in C ook altijd expliciet de primitieve typen naar elkaar cast.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1