Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: 4 tavua desimaaliluvuksi ja toisinpäin

Sivun loppuun

Pilari [01.12.2008 19:10:50]

#

Miten saa tavuista desimaaliluvun ja desimaalista tavun?

Antti Laaksonen [01.12.2008 19:12:32]

#

Mitä tarkoitat tavu(i)lla?

Pilari [01.12.2008 19:15:11]

#

byte tavut[3] <-- tuollaisia
EDIT: jotain tälläistä löytyi googlettamalla:

f = (bytes[0] << 24) |
            ((bytes[1] & 0xFF) << 16) |
            ((bytes[2] & 0xFF) << 8) |
            (bytes[3] & 0xFF);

TsaTsaTsaa [01.12.2008 19:19:24]

#

No mutta tuossahan on vain kolme tavua.

Pilari [01.12.2008 19:21:10]

#

TsaTsaTsaa kirjoitti:

No mutta tuossahan on vain kolme tavua.

Taulukot alkaa nollasta.

TsaTsaTsaa [01.12.2008 19:21:41]

#

Pilari kirjoitti:

TsaTsaTsaa kirjoitti:

No mutta tuossahan on vain kolme tavua.

Taulukot alkaa nollasta.

Mutta taulukkoa luodessa annetaan alkioiden määrä.

Pilari [01.12.2008 19:22:45]

#

Ops. Olet oikeassa: siinä pitäisi lukea tavut[4].
Muistelin että taulukot menee tällä tavalla:

byte tavut[3];
tavut[0] = 0x00;
tavut[1] = 0x00;
tavut[2] = 0x00;
tavut[3] = 0x00;

Metabolix [01.12.2008 22:15:02]

#

Osoittimen typpimuunnoksella.

typedef unsigned char byte;
float a;
float *ptr;
byte *tavut;

ptr = &a;
tavut = (byte*) ptr;

int i;
printf("%d tavua:", sizeof(a));
for (i = 0; i < sizeof(a); ++i) {
  printf(" %#04x", tavut[i]);
}
printf("\n");

Toki muunnoksen voi kirjoittaa yhdellekin riville, yritin vain selkeyttää asiaa yllä.

tavut = (byte*)&a;

Voit myös kopioida suoraan memcpy-funktiolla:

const int koko = sizeof(luku);
char tavut[koko];
memcpy(tavut, &luku, koko);

Toiseen suuntaan vastaavasti vaihtamalla memcpy-funktion parametrien järjestystä tai osoittimen tyyppimuunnoksella:

byte *tavut;
float *lukuosoitin;
float luku;

lukuosoitin = (float*) tavut;
luku = *lukuosoitin;

Jos muunnoksia uhkaa tulla paljon, voit harkita union-tietotyypin käyttöä.

union fb {
  float f;
  byte tavut[4];
};
fb luku;

luku.f = 10.3;
for (i = 0; i < 4; ++i) {
  printf(" %02x", luku.tavut);
}
printf("\n");

Pilari [02.12.2008 15:15:09]

#

Kiitoksia, nyt toimii.

Sisuaski [02.12.2008 15:53:01]

#

Kannattaa myös huomioida, että muuttujan lukemisen toisen tyyppisenä voi tehdä C++:ssa kauniisti myös templaateilla, jolloin syntaksista saa yhtä ruman kuin muillakin C++:n tyypinmuunnoksilla ja lisäetuna saat hämmennettyä koodisi lukijoita entisestään:

template<class A,class B>
A cast_dammit_cast(const B& b) {return *(A*)&b;}

float f=5.5f;
int i = cast_dammit_cast<int>(f);

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta