Jump to content
  • 0

Hoe de Hexadecimale waarde van een veld berekenen?


Stardust

Question

Posted

Beste Groep,

 

Ik zit met een probleem... Ik moet cijfercodes omzetten naar hun hexadecimale waarde maar (tenzij ik me vergis) biedt Filemaker (6.0 en hoger) hiervoor geen oplossing aan.

 

Wat is de bedoeling, eenvoudigweg wanneer ik een cijfercode invoer dat deze omgezet wordt naar de hexadecimale waarde zoals bij de hierna volgende voorbeelden:

 

205405000 wordt C3E3B48

205123000 wordt C39EDB8

205456000 wordt C3F0280

205789000 wordt C441748

205123410 wordt C39EF52

 

 

Kan iemand mij hier raad geven want ik heb geen idee hoe ik er dien aan te beginnen :-(

 

 

Met vriendelijke groet aan Allen,

 

Danny

9 answers to this question

Recommended Posts

  • 0
Posted

Nummer de cijfers van rechts naar links beginnend met 0 (pos)

 

de formule is dan:

DECIMAAL
cijfer(pos+1) * (10^pos)+
cijfer(pos+1) * (10^pos)+
....
bijv. 
19 =
9  * (10^0)+
1 * (10^1)

 

HEX
cijfer(pos+1) * (16^pos)+
cijfer(pos+1) * (16^pos)+
....
bijv. 
D9 = waarbij a, b, c staat voor resp 10, 11, 12
9  * (16^0)+
D * (16^1)

 

in een customfunction ziet het er zo uit.

 

Function Name and Parameters:
hex2dec ( hex )

Function Definition:
Let ( [
  h = "0123456789ABCDEF" ;
  hex = Filter ( Upper ( hex ) ; h ) ;
  d = Position ( h ; Left ( hex ; 1 ) ; 1 ; 1 ) - 1 ;
  s = Length ( hex ) - 1 
] ; 
  GetAsNumber (
  d * ( 16 ^ s ) + Case ( s > 0 ; hex2dec ( Right ( hex ; s ) ) )
  )
)

Call:
x = hex2dec ( "D00001" );

Result returned (number):
13631489

 

en andersom

 

Function Name and Parameters:
dec2hex ( dec )

Function Definition:
Let ( [
  h = "0123456789ABCDEF" ;
  r  = Mod ( dec ; 16 ) ;
  d = Int ( dec / 16 ) 
] ; 
  Case ( d ; dec2hex ( d ) ) & Middle ( h ; r + 1 ; 1 )
)

Call:
x = dec2hex ( 13631489 );

Result returned (text):
D00001

 

Je zal dit zelf in een calculatie veld moeten gieten al dan niet met een loop.

 

Quint

  • 0
Posted

Prachtig ... maar helaas ... niet te gebruiken in versie 6.xx :roll:

 

Maar toch bedankt voor deze oplossing die ik alleszins bewaar voor later in FM 8.5 toe te passen!! 8)

 

Ik ben echter wel benieuwd of dit voor FM 6x ook mogelijk is :?

 

Met hartelijke dank,

 

Danny 8)

  • 0
Posted

Ik heb de handschoen opgepakt en een aanzet tot de formule geschreven.

 

het werkt van 0 tot 255 ( 00 tot FF )

je zal het zelf nog moeten uitbreiden.

 

zipbestand in fp7 wel maar zonder custom functies

 

Quint

DectoHex.zip

  • 0
Posted

@ Quint: Prachtig!! Helaas is mijn wiskundige kennis wat verroest vrees ik :? Anderzijds, de DIV functie bestaat niet in v6.0 :roll:

 

@ Hiker: Daar was ik ondertussen ook al aan het grasduinen, maar dit omzetten naar FM v6.0 is me net wat te hoog gegrepen, ben ik bang :oops:

  • 0
Posted (edited)

@ Hiker: Daar was ik ondertussen ook al aan het grasduinen, maar dit omzetten naar FM v6.0 is me net wat te hoog gegrepen, ben ik bang :oops:

 

Als je het uitschrijft op papier dan valt het waarschijnlijk wel mee. Niet te snel opgeven! Juist van het proberen leer je het meeste.

 

Als je het volgende uitwerkt ben je al een heel eind:

 

Van Decimaal naar Hexadecimaal

We rekenen het getal 731 om in hexadecimale getallen. Daarvoor moeten we eerst uitzoeken wat de grootste macht van 16 is die erin past en hoe vaak hij erin past. Dat is in dit geval 16^2 = 256, want 16^3 = 4096 en dat past er niet in! 16^2 past er 2 keer in, dus dat is het eerste cijfer van ons hexadecimale getal. Daarna houden we 731-512 = 219 over. Dan kijken we hoe vaak de volgende macht van 16 daarin past, dus hoe vaak 16^1 = 16 erin kan. Dat is 13 keer. Het getal 13 is in hexadecimale cijfers een D, dus dat is het volgende cijfer voor ons getal. Dan proberen we hoe vaak de laatste macht van 16, 16^0 = 1, in het overgebleven getal past. Er blijft 219-208 = 11 over, goed voor het cijfer B. Achter elkaar geplaatst vormen deze cijfers het hexadecimale getal 2DB.

Edited by Guest
  • 0
Posted

Ook de div kan je omzeilen door Abs te gebruiken maar je voelt hem al, hoe meer je zelf moet vogelen hoe meer haakjes ( ) je zal moeten gebruiken.

Ik raak nu bij de 3e digit al de kluts kwijt..... :?:

  • 0
Posted

Voor die berekening is het simpel de radix aanpassen en de onnodige letters laten verdwijnen.

 

Iets in de aard van:

 

Middle("0123456789ABCDEF"; Mod(Int(Number/16^7); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^6); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^5); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^4); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^3); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^2); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^1); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^0); 16) + 1; 1)

 

Dat geeft voor:

205405000 precies C3E3B48 indien Number je nummerveld is.

 

Als je nu de radix dynamisch wilt aanpassen, wordt het:

 

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^3); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^2); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^1); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^0); Radix) + 1; 1)

 

Waar number en radix aparte veldjes zijn.

 

Je kunt ook een controleveld inbouwen om aan te geven of dat de berekening binnen de letterlimiet valt.

 

Iets in de aard van:

 

If(Number <= Radix^4 - 1; 1; 0)

 

Indien je dit veld via format op 'OK' zet voor positieve en op 'Not OK' voor negatieve cijfers, heb je een 'Alert' en weet je wat te doen. 8)

 

...en het werkt allemaal mooi in FM6 !! :lol:

  • 0
Posted

Jean,

 

Hoewel ik er geen snars van begrijp, kan ik alleen maar juichen ... Het werkt !!

 

 

Middle("0123456789ABCDEF"; Mod(Int(Number/16^7); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^6); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^5); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^4); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^3); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^2); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^1); 16) + 1; 1) &

Middle("0123456789ABCDEF"; Mod(Int(Number/16^0); 16) + 1; 1)

 

Doet exact wat ik wil, het zet de data die ik ingeef om naar de hexadecimale waarde!

Nu nog de andere formule doorgronden ...

 

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^3); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^2); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^1); Radix) + 1; 1) &

Middle("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Mod(Int(Number/Radix^0); Radix) + 1; 1)

 

Bedankt Jean en ook aan de anderen !!

 

Danny

Omzettingen.zip

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...