|
| Hex over flere adresser Fra : ApoX |
Dato : 30-07-01 10:07 |
|
Hej,
Jeg er kommet i den situation, at jeg nu både skal kunne skrive og læse
hexadecimaler, der strækker sig over flere adresser, fx fra 0x00000261 til
0x00000264. Denne række, fra 1 til 4, skulle gerne danne et tal - nu er
spørgsmålet så bare : hvordan læser jeg dette tal ? At skrive det, kan jeg
nemt forestille mig hvordan man gør, men det at læse ---
- Thomas
| |
ApoX (30-07-2001)
| Kommentar Fra : ApoX |
Dato : 30-07-01 11:26 |
|
> Jeg er kommet i den situation, at jeg nu både skal kunne skrive og læse
> hexadecimaler, der strækker sig over flere adresser, fx fra 0x00000261 til
> 0x00000264. Denne række, fra 1 til 4, skulle gerne danne et tal - nu er
> spørgsmålet så bare : hvordan læser jeg dette tal ? At skrive det, kan jeg
> nemt forestille mig hvordan man gør, men det at læse ---
Jeg har tænkt lidt over mit eget spørgsmål og er kommet frem til at jeg nok
skal bruge funktionen, BlockRead til det, men lige gyldigt hvor meget jeg
prøver, kan jeg ikke få funktionen til at virke med mine kære data. Enten er
det fordi det slet ikke er BlockRead jeg skal bruge, eller også er det fordi
jeg ikke fatter at bruge BlockRead - In both cases, I need help !
- Thomas
| |
Uffe Kousgaard (30-07-2001)
| Kommentar Fra : Uffe Kousgaard |
Dato : 30-07-01 11:49 |
|
Måske det her er hvad du leder efter ?
var
f: file of byte;
buf,numread: integer;
begin
assignfile(f,'bla.bla');
reset(f,1);
seek(f,$261)
blockRead(f, Buf, SizeOf(Buf), NumRead);
Buf indeholder nu dit tal, hvis det oprindeligt var kodet som en 32-bit
integer i filen.
"ApoX" <blomme@post.com> wrote in message
news:3b65356e$0$2586$edfadb0f@dspool01.news.tele.dk...
> > Jeg er kommet i den situation, at jeg nu både skal kunne skrive og læse
> > hexadecimaler, der strækker sig over flere adresser, fx fra 0x00000261
til
> > 0x00000264. Denne række, fra 1 til 4, skulle gerne danne et tal - nu er
> > spørgsmålet så bare : hvordan læser jeg dette tal ? At skrive det, kan
jeg
> > nemt forestille mig hvordan man gør, men det at læse ---
>
> Jeg har tænkt lidt over mit eget spørgsmål og er kommet frem til at jeg
nok
> skal bruge funktionen, BlockRead til det, men lige gyldigt hvor meget jeg
> prøver, kan jeg ikke få funktionen til at virke med mine kære data. Enten
er
> det fordi det slet ikke er BlockRead jeg skal bruge, eller også er det
fordi
> jeg ikke fatter at bruge BlockRead - In both cases, I need help !
>
> - Thomas
>
>
| |
ApoX (30-07-2001)
| Kommentar Fra : ApoX |
Dato : 30-07-01 11:57 |
|
> Buf indeholder nu dit tal, hvis det oprindeligt var kodet som en 32-bit
> integer i filen.
Sorry - redundansen er enorm på min grimme lille computer, så jeg har først
lige fået indlægget - tak for svaret !
- Thomas
| |
ApoX (30-07-2001)
| Kommentar Fra : ApoX |
Dato : 30-07-01 11:56 |
|
> Jeg har tænkt lidt over mit eget spørgsmål og er kommet frem til at jeg
nok
> skal bruge funktionen, BlockRead til det, men lige gyldigt hvor meget jeg
> prøver, kan jeg ikke få funktionen til at virke med mine kære data. Enten
er
> det fordi det slet ikke er BlockRead jeg skal bruge, eller også er det
fordi
> jeg ikke fatter at bruge BlockRead - In both cases, I need help !
Nogle gange føler jeg _virkelig_ jeg skriver herind bare for at få mig selv
til at tænke - har fundet ud af at bruge min BlockRead funktion ordenligt:
const
fil = 'c:\filen.fil';
var
a: byte;
r: longint;
b: longint;
procedure MakeBlockReady(startaddress : longint; count : integer);
begin
filemode:= 2;
assignfile(f,fil);
reset(f);
seek(f,startaddress);
blockread(f, b, count, r);
end;
procedure MakeEnded;
begin
closefile(f);
end;
begin
MakeBlockReady($269,$2);
{nu ligger det hele i min buffer}
MakeEnded;
end;
- Thomas
| |
Uffe Kousgaard (30-07-2001)
| Kommentar Fra : Uffe Kousgaard |
Dato : 30-07-01 11:58 |
|
Dit eksempel går sikkert galt. Blockread vil kun overskrive de første 2 ud
af 4 bytes i en integer. Hvad der derefter kommer ud af "b" er ret
usikkert - afhænger af hvad den var før. Hvis du kun vil læse 2 tegn, så
brug en word eller smallint for b.
"ApoX" <blomme@post.com> wrote in message
news:3b653c6e$0$2706$edfadb0f@dspool01.news.tele.dk...
> > Jeg har tænkt lidt over mit eget spørgsmål og er kommet frem til at jeg
> nok
> > skal bruge funktionen, BlockRead til det, men lige gyldigt hvor meget
jeg
> > prøver, kan jeg ikke få funktionen til at virke med mine kære data.
Enten
> er
> > det fordi det slet ikke er BlockRead jeg skal bruge, eller også er det
> fordi
> > jeg ikke fatter at bruge BlockRead - In both cases, I need help !
>
> Nogle gange føler jeg _virkelig_ jeg skriver herind bare for at få mig
selv
> til at tænke - har fundet ud af at bruge min BlockRead funktion ordenligt:
>
> const
> fil = 'c:\filen.fil';
>
> var
> a: byte;
> r: longint;
> b: longint;
>
> procedure MakeBlockReady(startaddress : longint; count : integer);
> begin
> filemode:= 2;
> assignfile(f,fil);
> reset(f);
> seek(f,startaddress);
> blockread(f, b, count, r);
> end;
>
> procedure MakeEnded;
> begin
> closefile(f);
> end;
>
> begin
> MakeBlockReady($269,$2);
> {nu ligger det hele i min buffer}
> MakeEnded;
> end;
>
> - Thomas
>
>
| |
ApoX (30-07-2001)
| Kommentar Fra : ApoX |
Dato : 30-07-01 12:20 |
|
> Dit eksempel går sikkert galt. Blockread vil kun overskrive de første 2 ud
> af 4 bytes i en integer. Hvad der derefter kommer ud af "b" er ret
> usikkert - afhænger af hvad den var før. Hvis du kun vil læse 2 tegn, så
> brug en word eller smallint for b.
Eksemplet var ikke helt virkelighedstro, da jeg har 4 værdier at trække fra.
Det handler bare om at sætte b til at være et longword for at få flest
muligt af tallene med, men som du forudsagde har dette også givet mig et par
problemer, da jeg simpelthen ikke kan finde et integer, der er større end
longword. Selvom longword er ret stort, kan det stadigvæk ikke tage når jeg
skal have et tal som 3520485255 frem. Så begynder den at vrøvle
med -774482041 og sådanne horible tal.
Skal jeg finde et større integer eller simpelthen bruge en anden metode ?
- Thomas
| |
ApoX (30-07-2001)
| Kommentar Fra : ApoX |
Dato : 30-07-01 12:39 |
|
> Eksemplet var ikke helt virkelighedstro, da jeg har 4 værdier at trække
fra.
> Det handler bare om at sætte b til at være et longword for at få flest
> muligt af tallene med, men som du forudsagde har dette også givet mig et
par
> problemer, da jeg simpelthen ikke kan finde et integer, der er større end
> longword. Selvom longword er ret stort, kan det stadigvæk ikke tage når
jeg
> skal have et tal som 3520485255 frem. Så begynder den at vrøvle
> med -774482041 og sådanne horible tal.
> Skal jeg finde et større integer eller simpelthen bruge en anden metode ?
Endnu engang har jeg fundet ud af, at fejlen egentlig var ret simpel med
lidt simpel debugging - selfølgelig kan 3520485255 da nemt være i et
longword, da et longword kan indholde helt op til 4294967295. Problemet var
så simpelthen, at en Tspinedit ikke kan indeholde så store tal, men tak skal
du have for hjælpen !
- Thomas
| |
|
|