Avatar billede brhino Nybegynder
17. januar 2009 - 21:49 Der er 5 kommentarer og
1 løsning

unsigned int virker ikke ?

Hej med jer

Jeg har kodet følgende metode, men den driller og jeg kan ikke forstå hvorfor !?

unsigned int byteToUInt32(char *bytearray)
{
    return (unsigned int)(bytearray[3] << 24 | bytearray[2] << 16 |
                  bytearray[1] << 8  | bytearray[0]);
}

Hvis byte array'et ser sådan her ud :
0xFE, 0xDC, 0xBA, 0x98

Får jeg et output fra metoden der ser sådan her ud:
4294967294 (0xFFFFFFFE)

Men hvis array'et ser ud som det her:
0x49, 0x66, 0x6F, 0x73

så returnere metoden det rigtige resultat, altså 1936680521 (0x736F6649) !?

For mig ser det ud som om den returnerede int er signed, altså modsat af hvad jeg beder den om... Hvor dog det ?
Avatar billede arne_v Ekspert
17. januar 2009 - 21:51 #1
Prøv of lav dit byte array til unsigned.
Avatar billede arne_v Ekspert
17. januar 2009 - 21:52 #2
Når en signed byte 0x98 promotes til signed int bliver den 0xFFFFFF98
Avatar billede arne_v Ekspert
17. januar 2009 - 21:55 #3
Bemærk iøvrigt at din kode konverterer et byte array til en int som little endian.

memcpy(&dinint, ditbytearray, sizeof(int));

vil konvertere et byte array til en int med systemets endianess.

Det er to forskellige typer funktionalitet (forskellen vise sig dog kun på big endian
systemer såsom PPC og SPARC).
Avatar billede arne_v Ekspert
17. januar 2009 - 21:57 #4
Hvis du vil bøje reglerne lidt, så er der:

dinint = *((int*)&ditbytearray);

Den bruger også systemets endianess.

Og kører du på en SPARC og ditbytearray ikke starter på en addresse som er et multipla
af 4, så får du en fejl.
Avatar billede brhino Nybegynder
17. januar 2009 - 22:13 #5
Du har fuldstændig ret mht. at lave mit bytearray om til unsigned. Det med funktionalitet er lige en tand over min forstand, men smid et svar :)
Avatar billede arne_v Ekspert
17. januar 2009 - 22:17 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester