Toon posts:

[C] Integer lezen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een integer (4 bytes) uit een bestand te lezen. Daarvoor stop ik eerst 4 bytes in een buffer, maar hoe krijg ik deze 4 bytes in een integer?

Dit heb ik al geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
int testje() {
    int bla;
    int * blub;
    char buf[10];
    strcpy(buf, "biertje");
    blub=(int *)buf;
    bla=&blub;
    printf("%x\n", bla);
    return 0;
}

Het is de bedoeling dat er 0x62696572 uit komt, ofzo.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
ofzo?

0x62696572 ziet er niet echt als een integer uit, vind je niet? Dat is het adres waar dat getal zich in het geheugen bevindt.

Ik zie in je code voorbeeld eigenlijk ook nergens waar je iets uit een bestand uitleest. Het enige wat je doet is een character array opvullen met een string en dan wil je blijkbaar die array casten naar een pointer naar een integer.....
Beetje vreemd vind ik....

https://fgheysels.github.io/


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

ik zie je om te beginnen nergens een integer in die buffer stoppen...

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

C:
1
2
3
4
5
6
7
void main()
{
        int buf[10];
        buf[0]=1;
        printf("%d\n", *buf);
        return 0;
}

[ Voor 18% gewijzigd door D2k op 13-04-2003 15:15 ]

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Ik lees vier bytes uit een bestandje. Dit heb ik in bovenstaand codevoorbeeld gedaan door het woord "biertje" in buf te stoppen. De eerste vier letters daarvan moeten dan in een integer gestopt worden. Een integer is een getal van 4 bytes groot.

Een mogelijkheid is:
code:
1
int bla = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]


Ik dacht eerst dat er een makkelijkere manier zou zijn, maar de source van rsync duidt erop dat dit niet zo is, want ze doen het als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define CVAL(buf,pos) (((unsigned char *)(buf))[pos])
#define PVAL(buf,pos) ((unsigned)CVAL(buf,pos))
#define SCVAL(buf,pos,val) (CVAL(buf,pos) = (val))
#define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8)
#define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16)

int32 read_int(int f)
{
        char b[4];
        int32 ret;

        readfd(f,b,4);
        ret = IVAL(b,0);
        if (ret == (int32)0xffffffff) return -1;
        return ret;
}

Verwijderd

Topicstarter
Maar dat voorbeeld uit rsync draait ook alle bytes om, volgens mij. Iemand enig idee waarom dat is?

Verwijderd

Verwijderd schreef op 13 April 2003 @ 15:21:
Ik lees vier bytes uit een bestandje. Dit heb ik in bovenstaand codevoorbeeld gedaan door het woord "biertje" in buf te stoppen. De eerste vier letters daarvan moeten dan in een integer gestopt worden. Een integer is een getal van 4 bytes groot.
Okee, maar vervolgens zet je het adres in plaats van de waarde van deze pointer in de int. Dus je moet dan doen:

C:
1
2
3
4
5
6
7
char buf[10];
int bla;
int *blub;

strcpy(buf, "biertje");
blub = (int *) buf;
bla = *blub;


See?
code:
1
        if (ret == (int32)0xffffffff) return -1;
Een int kan maar tot de 0x7fffffff, omdat ie signed is. Voor 0xffffffff moet je een unsigned int gebruiken, uint32.

[ Voor 3% gewijzigd door Verwijderd op 13-04-2003 19:58 ]


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Verwijderd schreef op 13 April 2003 @ 19:38:
Maar dat voorbeeld uit rsync draait ook alle bytes om, volgens mij. Iemand enig idee waarom dat is?
Ik weet niet waar deze code verder voor is, maar het kan zijn dat het bestand in little of big indian formaat staat en dus de andere nodig heeft.
Het getal 0x12345678 kan namelijk in bytes worden opgeslagen als
0x12, 0x34, 0x56, 0x78
maar ook als
0x78, 0x56, 0x34, 0x12

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22

Pagina: 1