ASCII naar UInt_32

Status
Niet open voor verdere reacties.

HelpElec

Gebruiker
Lid geworden
6 mrt 2013
Berichten
102
Beste allemaal,

Ik heb een functie gemaakt om een UInt_8 array van ASCII-karakters om te zetten naar een decimale waarde UInt_32.
De functie ziet er zo uit:

Code:
UInt_32 ASC_to_UInt32(UInt_8 *PtrASC, UInt_8 Len)    //Len is de lengte van de array
{
	UInt_8 Temp, i, Start, Length;
	UInt_32 Rslt=0;
	
	Start = 0;

	if(Len > 10)    //maximale waarde voor een UInt_32 = is 4294967295, dus 10 karakters
	{
		Temp = Len - 10;
		for(i=0;i<Temp;i++)
		{
			PtrASC++;
		}
		Length=10;
	}
	else
	{
		Length=Len;
	}

	for(i=0;i<Length;i++)
	{
		Temp = *PtrASC;
		Temp -= 48;          //ASCII-karakter - 48 = de waarde van het karakter.
		if(Temp || Start)    //Vanaf het eerste waarde hoger dan 0 moet het getal gevormd worden. 
		{
			Start=1;
			Rslt += Temp;
			Rslt *= 10;
		}
		PtrASC++;
	}
	return Rslt;
}

Ik pas deze functie nu toe in een situatie waarin een array als argument wordt meegegeven die de lengte 10 heeft en de karakters:

Code:
{'1','1','0','8','8','5','6','7','0','1'};

als ik voor Len 6, 7, 8, 9 of 10 meegeef krijg ik als Rslt = 4294966054.
De maximale waarde voor een UInt_32 is 4294967295.
Geef ik 1, 2, 3, 4 of 5 mee voor Len, krijg ik, zoals je zou verwachten, respectievelijk: 1, 11, 110, 1108 en 11088 terug.
Iemand een idee waarom ik deze verschillen krijg? Of een suggestie hoe je deze conversie anders kunt uitvoeren (en een conversie andersom, dus van een UInt_32 naar een array van UInt_8's)?

Bedankt!
 
Mocht je de conversie van een decimale waarde naar een ascii array nog niet hebben opgelost: denk even terug aan hoe getallen worden opgebouwd in het decimaal stelsel: 594 -> 5*10^2 + 9*10^1 + 4*10^0. Het getal 594 delen door 100 (10^2) heeft als resultaat dus 5, 94 delen door 10 (10^1) heeft als resultaat 9 en 4 delen door 1 (10^0) heeft als resultaat 4.

ps: 4294967295 kunnen dan misschien wel 10 digits zijn, maar je kunt niet in alle gevallen ook 10 digits opslaan (9999999999 geeft je gewoon een overflow). En voor het geval je het niet weet, de loop die je gebruikt wanneer de lengte hoger dan 10 is die is eigenlijk niet per se nodig. Je zou de elementen in de array ook in de vorm van *(arr + pos) kunnen aanspreken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan