/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Typecasting: IntToHex ?
Fra : ApoX


Dato : 29-07-01 10:06

Hej,

Som varslet kom der endnu et spørgsmål fra min side omhandlende
grundlæggende hex. Det jeg gerne vil vide denne gang er, om nogen er i
besiddelse af en typecasting funktion, der konverterer integers til
hexadecimaltal eller har lyst til at skrive mig én.

- Thomas



 
 
ApoX (29-07-2001)
Kommentar
Fra : ApoX


Dato : 29-07-01 10:19

> Som varslet kom der endnu et spørgsmål fra min side omhandlende
> grundlæggende hex. Det jeg gerne vil vide denne gang er, om nogen er i
> besiddelse af en typecasting funktion, der konverterer integers til
> hexadecimaltal eller har lyst til at skrive mig én.

Hov ! Funktionen IntToHex findes jo allerede, men det var nu heller ikke
præcis det jeg mente da jeg snakkede om IntToHex. Funktionen IntToHex,
konverterer jo blot tallet til en streng, der ligner en hexadecimal, men når
jeg nu skal gemme det som en byte i en fil, opstår problemet...

- Thomas



Uffe Kousgaard (29-07-2001)
Kommentar
Fra : Uffe Kousgaard


Dato : 29-07-01 10:31

Hej

Jeg tror du har misforstået noget omkring hexadecimale tal. Når man har
deklareret en fil af typen "file of byte" indeholder den en sekvens af tal
mellem 0 og 255, som jo er hexadecimale tal med 2 cifre. Hvis du vil gemme
$40 (=64 i 10-tals-systemet) kan du f.eks. bruge følgende for at følge op på
eksemplet fra i går:

a:= $40;
write(f,a);

som er nøjagtigt det samme som:

a:= 64;
write(f,a);

IntToHex funktionen er kun til visning af hexadecimale tal, som du også har
opdaget og typecasting giver ikke rigtig nogen mening i denne sammenhæng.

Jeg mener ikke, der findes en tilsvarende delphi-notation for binære tal,
f.eks. kunne £1000000 have betydet et binært tal (igen er det 64 der
spøger).

Hilsen
Uffe

"ApoX" <blomme@post.com> wrote in message
news:3b63d446$0$5970$edfadb0f@dspool01.news.tele.dk...
> > Som varslet kom der endnu et spørgsmål fra min side omhandlende
> > grundlæggende hex. Det jeg gerne vil vide denne gang er, om nogen er i
> > besiddelse af en typecasting funktion, der konverterer integers til
> > hexadecimaltal eller har lyst til at skrive mig én.
>
> Hov ! Funktionen IntToHex findes jo allerede, men det var nu heller ikke
> præcis det jeg mente da jeg snakkede om IntToHex. Funktionen IntToHex,
> konverterer jo blot tallet til en streng, der ligner en hexadecimal, men
når
> jeg nu skal gemme det som en byte i en fil, opstår problemet...
>
> - Thomas
>
>



dyekjaer (30-07-2001)
Kommentar
Fra : dyekjaer


Dato : 30-07-01 16:17

Så vidt jeg kan se, så er den jo næsten indbygget:
Lav en konstant af typen char, på 16 tegn, med tallene
'0123456789ABCDEF', og så kan du jo nemt omsætte fra decimal til hex, så
længe du holder dig til en hexdigit.
Hvis du har brug for flere, så kan du definere et array, hvor du gemmer
dem af to tegn: ('00', '01', '02',..., 'FF') - og så skulle det vist
også være nemt. Det fylder ca. 512 bytes konstanter (gemmes sammen med
kode). Og så kan du jo også nemt, skrive enhver byte ud som hex, eller
bruge lo(x) og hi(x) for at "sammensætte" to konverterede hexbytes til
et word, eller en integer med koden hex[hi(x)]+hex[lo(x)] og så er det
jo nemt nok. Naturligvis, så kan du også fortsætte, og gøre det med 32
bits longinteger osv. Så det skulle vist ikke give nogen problemer.

Fordelen ved at lave ovenstående variabel på 512 tegn, er at det ofte er
en meget hurtig måde at omsætte til hexidecimal, altså det anvendes
meget få computer resourcer. Kun et par opslag i ram'en, der læses som
32 bit, er nok. Det vil dog nok være ligeså godt i maskinkode på en ny
PC, fordi at den har indbygget cache i processoren. Men hvis du ikke vil
anvende en konstant til det, så kan du jo også bruge en af de andre
metoder, hvor at man returnerer med chr(x+48) for x<=9, og chr(x+55) når
x er i intervallet fra 10 til 15 (for en digit kun) og på grund af
cachen, går det også hurtigt idag. Men den metode med at slå op i ram,
er faktisk hurtigst på nogle computere, også nogen af de gamle, hvor
ram'en var hurtig, og der ikke var cache i cpu'en (ved hele bytes.) Det
mest overskuelige er dog at anvende konstanter, enten en på 512 bytes,
som tager "bytes" direkte og omsætter til hex, eller en på kun "en
digit" som førhen på zx81, der jo kun havde 256 bytes fri. Naturligvis,
så kan man anvende hexdig[x shr 4]+hexdig[x and 15] for at anvende den
lille konstant på kun en digit, hvis den skal kunne bruges til en hel
byte. Jeg syntes dog, at en defination af en konstant for hele byte
området er mere overskuelig i programmet, i stedet for at lave
operationer som shift, og "and". Og måske enda også ligge "magiske tal"
som 48 eller 55 til, hvilket i øvrigt heller ikke er så kompatibel, hvis
compilerne anvender forskellige andet end ascii, som jo så ikke
nødvendigvis har tal og bogstaver til at ligge i rækkefølge (bcd like
formater.) Så nu er det bare, at gå igang med at skrive alle hexciffer
op fra begyndelsen af, og lægge dem ind. Enten som byte, hvilket jeg
syntes er smart af hensyn til programmets overskuelighed, eller som
"hexidecimal" og så altså til at anvende shr 4, og and 15. Det at
anvende en lille konstant på kun 16 tegn, kan måske også gøre den
interne brug af cachen mere effektiv, da at man jo så ikke optager hele
512 bytes her, med denne omsætningsfunktion. 512 bytes i lageret er jo
intet i nutidens dage.

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


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

Månedens bedste
Årets bedste
Sidste års bedste