Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL Uint32 -> Hex

Sivun loppuun

kayttaja-3842 [18.08.2009 22:20:08]

#

Tervehdys kaikille,

Elikkäs pitäisi saada muutettuu Uint32 tyyppisen muuttujan väriarvot hex desimaaleiksi.


Eli jos Uint32 sisältää sinisen värin niin Uint32 -> int(0x0000ff)


...vai onko se sillon hex desimaalina kun tieto siirretään suoraa Uint32 int:hen?

-Kiitos.

Grez [18.08.2009 22:43:14]

#

Heksadesimaali on luvun 16-kantainen esitysmuoto, jossa arvot 0-9 saavat merkit 0-9 ja arvot 10-15 merkit a-f (tai A-F)

Ehkä voisit hieman paremmin selittää, mitä yrität tehdä.

kayttaja-3842 [18.08.2009 22:51:29]

#

Elikkäs olen tekemässä sellaista ns. "ilotulitus" effektiä ja minulla on väri arvot syötettynä hexdesimaaleina.

Effektissäni luen näytön pinnalta getPixel funktiollani värin koordinaateista. Tämän jälkeen funktio palauttaa koordinaatistossa olevan väri arvon Uint32 tyyppisenä ja tämä tieto pitäisi saada muutettuu takaisin hexdesimaali muotoon.

Edit1:

Sekin kelpaa jos Uint32 sais muutettua RGB muotoon. Eli esim SDL_Color muotoon.

Spongi [18.08.2009 23:17:38]

#

Oiskoha tästä jotain

#include <stdio.h>

int main()
{
    unsigned int luku = 0x123456;
    unsigned char r,g,b;
    r = (luku >> 16) & 255;
    g = (luku >> 8) & 255;
    b = luku & 255;

    printf("heksana koko juttu: 0x%6x\n", luku);
    printf("desimaalina koko juttu: %d\n", luku);
    printf("heksana eriksee: 0x%2x 0x%2x 0x%2x\n", r, g, b);
    printf("desimaalina eriksee: %d %d %d\n", r, g, b);

    return 0;
}

Grez [18.08.2009 23:21:24]

#

Edit: Spongi näköjään ehtikin ensin.

En kyllä vieläkään ymmärrä miksi se uint32 pitää muuttaa heksadesimaaliksi. Sehän on kuitenkin lähinnä ihmiskäyttöön tarkoitettu muoto..

Mutta siis, esimerkissäsi uint32 0x000000ff oli sininen, eli ilmeisesti B on vähiten merkitsevä tavu.

RGB-muotoon (x on siis se uint):

r = (x>>16) & 0xff;
g = (x>>8) & 0xff;
b = x & 0xff;

hex-muotoon saa esim. seuraavasti:

printf("%X", x);

kayttaja-3842 [19.08.2009 10:08:39]

#

Aivan, tuo "& 0xff" oli jäänyt poijes perästä. Mitä muuten tuo & tuossa meinaa? Lisääkö se Uint32 otettuihin bitteihin 0xff, vai mikä idea tuossa & 0xff on tuossa?

Chiman [19.08.2009 10:59:01]

#

& on monessa kielessä binary and -operaattori: http://en.wikipedia.org/wiki/Binary_and

Tuossa tapauksessa sen avulla suodatetaan pois (muutetaan nolliksi) muut kuin alimmat 8 bittiä, jotka jätetään ennalleen. Heksana siis poistetaan muut kuin kaksi vikaa merkkiä.

jalski [19.08.2009 11:19:42]

#

Jos tykkää bittien pyörittelystä ja haluaa toteuttaa ASCII heksadesimaalimuunnoksen itse, niin alla on esimerkkinä joskus jonnekin postituslistalle kirjoittamani assembler esimerkkiohjelma, mikä muuntaa yhden tavun. Kääntynee ainakin jollain TASM yhteensopivalla assemblerilla.

;
; Simppeli testiohjelma DOSsille, mikä kirjoitttaa ruudulle
; luvun 123 heksamuotoisena (=0x7B)
;
.model small

.stack 1024

.data

luku db 123
etuliite db '0x'
heksaluku dw ?
db "$"


.code

main:
	mov, ax, _DATA
	mov ds, ax

muunna:
	mov al, [luku]
	aam 16

 @digit2:
	add al, 090h
	daa
	adc al, 040h
	daa

 @digit1:
	xchg al, ah
	add al, 090h
	daa
	adc al, 040h
	daa

 @talteen:
	mov [heksaluku], ax

ruudulle:
	mov dx, offset etuliite
	mov ah, 09h
	int 21h

exit:
	mov ax,4c00h
	int 21h

end main

kayttaja-3842 [19.08.2009 17:17:24]

#

Jalski, ihmettelempä vain, että miten tuo sinun postisi kuuluu asiaan? :O

Ensinnäkin en ole koodaamass assemblyllä vaan C/C++ toiseksi, en halua muuttaa ASCII:ta hexksoiksi?


...kiitos kuitenkin kaikille avusta. :)

jalski [19.08.2009 20:14:43]

#

Tuo laittamani esimerkki ei siis muuta ASCII:ta heksaluvuksi, vaan muistissa olevan tavun ASCII heksadesimaaliksi ja kirjoittaa sen näytölle. Suurin osa C-kääntäjistä sallii inline assemblyn käyttämisen ja C-kutsuttavien funktioiden kirjoittaminen assemblyllä ei ikävä kyllä vieläkään ole mikään turha taito hallita.

kayttaja-3842 [20.08.2009 09:04:17]

#

Noh tämä menee kyllä nytten ihan väittelyksi, mutta minkäs teet.

Olet oikeassa, että ei ole turha taito hallita, mutta assembly on vain sellainen kieli jota kannattaa vain käyttää sillon kun sitä oikeasti tarvitaan. Syy voi tietenkin olla mikä vain, mutta lähinnä lähitsin käyttämään assemblyä, jos tarvitsen oikeasti nopeutta ohjelmaltani tai pientä kokoa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta