PDA

View Full Version : [C] 2 Hex waardes naar ASCII


HerCule
15-05-2007, 10:37
Heren,

Ik zit hier met een probleem...Ik heb hier twee counter waardes in C waarmee ik een tijd moet berekenen

Ene lage en ene voor de carry steeds: Beide zijn hexadecimaal. Elke increment van
counter low stelt 170,6Ás (0,0001706s) voor. Wanneer er dus 256*170,6Ás zijn geweest (+- 43ms) en de timing nog niet voorbij is, increment counter_high. Gewoon een carry eigenlijk. Maar nu is de bedoeling dat ik de tijd naar de seriŰle poort uitvoer in plain text, gewone HEX ASCII dus...

Dus zoals hieronder: 100(0x64) * 43ms = 4,3s + 1 (0x01)* 170,6Ás

= 4350,470ms

Maar hoe krijg ik dit nu verdorie in ASCII HEX omgezet en waar moet ik op letten bij het kiezen van het type van variabelen?

Kan er iemand me uit de nood helpen ?


counter_low = 0x01; //decimaal 1
counter_high = 0x64; //decimaal 100 -- samen dus 101

// Hoe kan ik hier nu de tijd uithalen en dit als volgt in een char array krijgen om dit uit te kunnen schrijven ? 4350.470ms

array[10] = "4350.470ms";

Bavo
15-05-2007, 10:44
Hebt ge de berekening nu niet zelf gegeven?

HerCule
15-05-2007, 10:47
Ja de berekening wel ja :)

Maar hoe schrijf ik de functie ervoor, hoe zet ik dan die hex waardes om in een ander type, reken ik daar dan mee en krijg ik het vervolgens in een array met hex ascii text waardes ? Vooral dat laatste dan. Hoe zet ik een long getal om in een text array ?

Bavo
15-05-2007, 10:49
Is dat zo een euvel in C? In Java zou je gewoon naar het juiste type casten en dat is dat, of een van de primitive wrappers gebruiken ter transformatie. Benieuwd naar de oplossing, dan

Dorpsidioot
15-05-2007, 10:57
sprintf...

Bavo
15-05-2007, 10:58
C, de taal voor mensen met weinig woorden :)

HerCule
15-05-2007, 10:58
Sprintf is geen optie, gebruikt veel te veel geheugen en dat is niet voorhanden in de microcontroller die ik gebruik... geen stdio zakes hier :-)

Bavo
15-05-2007, 11:13
http://www.gidforums.com/t-2615.html heeft een algoritme die je conversie lijkt te doen (sinds hex intern een int is moet dit werken, juist?)

HerCule
15-05-2007, 11:20
Merci voor de snelle reply mensen, ik ga het eens bekijken ...

BuiZe
15-05-2007, 14:11
int main()
{
char hex[3] = "FF";

int value = ((int)(hex[0]>='a'?(hex[0]-'a'+10):(hex[0]>='A'?(hex[0]-'A'+10):hex[0]-'0')))*16
+ (int)(hex[1]>='a'?(hex[1]-'a'+10):(hex[1]>='A'?(hex[1]-'A'+10):hex[1]-'0'));

printf("%s = %i\n",hex,value);
}


Edit: bavo wees me er op dat je het omgekeerde zocht... ik ging er diagonaal lezend van uit dat je de niet-triviale kant zocht.

int main(int argc, char** argv)
{
char x[17] = "0123456789ABCDEF";
int value = atoi(argv[1]);
char hex[3];

hex[0] = x[value>>4];
hex[1] = x[value&15];
hex[2] = '\0';

printf("%s = %i\n",hex,value);
}

of voor volledige 32-bit integers:
int main(int argc, char** argv)
{
const int SIZE = 8;
char x[17] = "0123456789ABCDEF";

int value = atoi(argv[1]);
char hex[SIZE+1];

int i=SIZE-1;
for(; i>=0; i--)
{
hex[i] = x[value&15];
value = value>>4;
}
hex[SIZE] = '\0';

printf("%s = %i\n",hex,value);
}

Karel
24-05-2007, 12:55
Mja, klein detail, hij wou longs omzetten ipv ints, dus enkele dingen in je voorbeeld kloppen nog niet. Hex wordt potentieel veel te laat afgesloten met \0, bij een klein getal bv wordt er door gedaan terwijl alle hogere hex waardes 0 zijn, en wordt altijd op het einde van de string de \0 gezet terwijl die korter kan zijN. Ik weet de grootte van longs niet van buiten, en het is ook platform-afhankelijk, maar dit zou overal moeten werken:


const int SIZE = 8;
char x[17] = "0123456789ABCDEF";

long value = 0xA12C; // test :)
int size = sizeof(long) / 4 + 1;
char *hex = new char[size];

int i=size-2;
for(; i>=0; i--)
{
hex[i] = x[value&15];
value = value>>4;
if (value == 0) break; // vervroegd afbreken
}
hex[size-1] = '\0';

// shift output naar linkerkant van string
for (int j = 0; j < size-i; ++j)
hex[j] = hex[j+i];

printf("%s = %i\n",hex,value);
}

Karel
24-05-2007, 13:15
Maar euh... bij nader inzien is volgens mij deze oplossing totaal naast de kwestie. Maar voor ik iets anders voorstel moet je toch eens je berekening uitleggen, want ik snap er niks van.

100 * 43ms + 1 * 170,6Ás = 4300ms + 0,1706ms = 4300,1706ms, lijkt mij.

Of een counter nu ge´nitialiseerd wordt alszijnde hex of decimaal of binair, dat maakt intern totaal niks uit he. Het is gewoon een hulpmiddeltje voor de leesbaarheid te bevorderen. Intern vermenigvuldig je gewoon binaire ints (longs) met elkaar.