Ik wil vanuit een blok bytes variabelen lezen.
Deze variabelen kunnen allerlei groottes hebben (8-bit, 16-bit, 32-bit) en overal staan.
Bijvoorbeeld: Het lezen van een bootsector van een diskette, en daar een willekeurig 16-bits getal uithalen.
Dit valt niet mee helaas...
(voor Unix/Linux)
Dit progje leest de bootsector van een diskette, en zet het laatste 16-bits getal op het scherm. Bij bootsectors is dit standaard 0xaa55.
Natuurlijk geen zinvol programma, maar het is als test, en het is het begin van iets dat wel wat zinnigs gaat doen.
Ik lees eerst de 512 bytes van de bootsector in een ruimte waarnaar de pointer bootsector wijst.
Daarna probeer ik een waarde te lezen.
In dit geval een 16-bits getal, dat op de 510e byte staat (vanaf 0 geteld uiteraard).
Als eerste moet hij weten dat het een 16 bits unsigned getal is, vervolgens moet ik de pointer bootsector verhogen.
Maar nu het gekke: Omdat het om 16-bits getallen gaat, wordt ook verwacht dat ik in eenheden van 16-bits reken, terwijl het gewoon om een blok bytes gaat!
Dus in plaats van 510 moet ik 255 als offset gebruiken.
Als ik nou het laatste byte wil hebben, kan ik daar gewoon met +511 bij, want met bytes werk je ook in eenheden van bytes.
Maar wel dat ik nou bv. het 3e 16-bits getal wil hebben?
Kan ik dat voorelkaar krijgen zonder allemaal gegoochel met losse bytes? (oftewel: In een keer een 16-bits getal uitlezen op welke byte postitie dan ook, of in een keer een 16-bits getal uitlezen, op welke byte positie dan ook)
Deze variabelen kunnen allerlei groottes hebben (8-bit, 16-bit, 32-bit) en overal staan.
Bijvoorbeeld: Het lezen van een bootsector van een diskette, en daar een willekeurig 16-bits getal uithalen.
Dit valt niet mee helaas...
(voor Unix/Linux)
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
| #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
void *bootsector;
int fd;
fd=open("/dev/fd0",O_RDONLY);
if (fd<0) {
printf("Error while opening /dev/fd0.\n");
return(-1);
}
bootsector=malloc(512);
lseek(fd,0,SEEK_SET);
read(fd,bootsector,512);
printf("%x\n", (unsigned short int) *( ((unsigned short int*)bootsector) + 255 ) );
close(fd);
free(bootsector);
} |
Dit progje leest de bootsector van een diskette, en zet het laatste 16-bits getal op het scherm. Bij bootsectors is dit standaard 0xaa55.
Natuurlijk geen zinvol programma, maar het is als test, en het is het begin van iets dat wel wat zinnigs gaat doen.
Ik lees eerst de 512 bytes van de bootsector in een ruimte waarnaar de pointer bootsector wijst.
Daarna probeer ik een waarde te lezen.
In dit geval een 16-bits getal, dat op de 510e byte staat (vanaf 0 geteld uiteraard).
code:
1
| (unsigned short int) *( ((unsigned short int*)bootsector) + 255 ) |
Als eerste moet hij weten dat het een 16 bits unsigned getal is, vervolgens moet ik de pointer bootsector verhogen.
Maar nu het gekke: Omdat het om 16-bits getallen gaat, wordt ook verwacht dat ik in eenheden van 16-bits reken, terwijl het gewoon om een blok bytes gaat!
Dus in plaats van 510 moet ik 255 als offset gebruiken.
Als ik nou het laatste byte wil hebben, kan ik daar gewoon met +511 bij, want met bytes werk je ook in eenheden van bytes.
Maar wel dat ik nou bv. het 3e 16-bits getal wil hebben?
Kan ik dat voorelkaar krijgen zonder allemaal gegoochel met losse bytes? (oftewel: In een keer een 16-bits getal uitlezen op welke byte postitie dan ook, of in een keer een 16-bits getal uitlezen, op welke byte positie dan ook)