Gå til innhold

C#: Kombinere to verdier i ett byte-arry til en uint.


Anbefalte innlegg

Vet det er en elendig emnetittel, så jeg prøver å forklare litt nærmere her.

 

Jeg har da ett byte-array hvor posisjon 1 inneholder 64 og posisjon 2 inneholder 86.

 

Jeg trenger å lagre dette i en uint som tallet 8664. Hvordan kan jeg gjøre dette uten å gå veien om string?

 

 

Btw. Tallene jeg brukte var bare eksempler.

 

 

Takk,

Mvh; ze5400

Endret av ze5400
Lenke til kommentar
Videoannonse
Annonse

int tall1;

int tall2;

int tall3;

 

tall1 = 8;

tall2 = 96;

 

if (tall2 > 99)

tall3 = (tall1*1000) + tall2;

else if (tall2 > 9)

tall3 = (tall1*100) + tall2;

else

 

tall3 = (tall1*10) + tall2;

 

uten at jeg har testa det så burde vel det fungere?

 

Edit: ah.. du skulle ha det største tallet først? ta må du bare switche de først :p

Endret av The_Viper@EFNET
Lenke til kommentar

Takk for svar folkens :)

 

Ser ut til at jeg feilet å spesifisere.

 

Metoden til Svish funker greit på decimale tall (føler meg ganske dum som ikke kom på det selv :p)

 

Metoden til The_Viper er vel i grunn metoden til Svish, bare litt proppa av if/else. Enhver sin smak :p

 

Selv foretrekker jeg en løkke til det ...

 

			uint RetVal = 0;
		uint MPlier = 1;

		for (int i = 0; i < size; i++)
		{
			RetVal += ((uint)BinaryFile[CLocation++] * MPlier);
			MPlier = MPlier * 100;
		}

		return RetVal;

 

Metoden til Henning tar vel bare to parametere, og virker vel også kun riktig i decimal?

 

 

Jeg beklager å plage dere, men i tillegg til at jeg har oppdaget at C# ikke er som å sykle (glemmer det ikke etter å ha vært foruten en stund :p) suger jeg også maks i matte.

 

 

Uansett. Saken er at jeg må ha det til å virke slik:

 

4D+5D må bli 5D4D. Null problem om jeg går via string, men da føler jeg meg skitten.

Så klart lagrer uinten dette som 23885, men når jeg ber om å vise det som hex blir det fortsatt riktig.

(Kalkulatoren: 5D+4D*100 = 5D4D = 23885dec)

 

Problemet mitt er at når jeg prøver å gjøre dette blir det det samme som 99+77*100 = 7793dec = 1E77hex.

 

 

Jeg vet jeg suger i matte. Jeg vet jeg suger i å forklare. Jeg vet jeg suger i C#.

 

Derfor har jeg ett ørlite håp om at noen er forstår hva jeg prøver på og har en smart løsning å dele med meg :)

 

 

Takk;

ze5400

Lenke til kommentar

Skit au.

 

Det enkle er ofte det enkle :tease:

 

Endte opp med dette og gikk via string ...

 

		protected uint ReadBlockUInt(uint size)
	{
		CLocation += size;

		uint TLocation = CLocation;
		uint RetVal = 0;
		string TMP = null;

		for (int i = 0; i < size; i++)
		{
			TMP += BinaryFile[--TLocation].ToString("X");
		}

		uint.TryParse(TMP, System.Globalization.NumberStyles.HexNumber, null, out RetVal);


		return RetVal;

 

Noen innvendiger/forslag til forbedringer?

 

 

Takk;

ze5400

Endret av ze5400
Lenke til kommentar

Ah, jeg tenkte feil, å dele på ti er ikke riktig, en må ha tiende roten istedet.

 

Her er en fungerende kode som ikke bruker strings :) og dessuten så kan du skrive inn så mange tall du vil :p

 

public static uint Exp(uint basev, uint exponent)
{
uint ret = basev;
for (int i = 0; i < exponent; i++)
	ret *= basev;
return ret;
}
public static uint CombineInts(uint start, params uint[] values)
{
foreach (uint v in values)
	start += Exp(10, (uint)Math.Pow(start, 1.0 / 10) + 1) * v;
return start;
}

 

Kanskje noen vet om en bedre metode en å bruke tienderot :p

Endret av GeirGrusom
Lenke til kommentar

Istedet for å gange med 100 tar du jo da å ganger med base^2 (hvilket for 10 er 100).

 

uint sum = 0;

for(int i=0; i<array.length; i++)
 sum += array[i] * base^(i+1)

 

eller noe sånt... uansett så blir det vel litt samme tankegang som når en skal regne om fra et tallsystem til et annet. om jeg ikke tenker helt riv ruskende galt :p

Lenke til kommentar

Tusen takk GG!

 

Må nok avsløre meg som en premieidiot og si at jeg faktisk ikke klarer å bruke funksjonene du var så snill å skrev.

 

Til tross for din MSDN-lignende dokumentasjon må jeg tilstå at jeg faktisk ikke har aning på hvordan jeg går frem :p

 

uint[] TMP = new uint[2];

TMP[0] = 0x5D;

TMP[1] = 0x4D;

 

uint NewVal = ???(???, ??? ...);

 

 

Hva kaller jeg for å få NewVal til å inneholde 23885 (0x5D4D)?

 

 

Beklager at jeg maser på denne måten. Jeg hater å måttet gjøre det, da det får meg til å føle meg, rett og slett, dum.

Lenke til kommentar

Men min funksjon, som kanskje er mer av akademisk interesse, så skriver du bare

 

uint NewVal = CombineInts(tmp[0], tmp[1]);

 

Men jeg tror ikke det er dette du egentlig er ute etter

uint NewVal = tmp[0] | (tmp[1] << 8); // Flytter verdien i tmp[1] 8 bit til venstre og legger den til

skal bli 0x4d5d

 

Jeg ble litt forvirret, fordi du har blandet sammen binærtall og desimaltall i en herlig suppe, den koden jeg skrev er kun ment for desimaltall.

For å flytte binærtall bruker du bitshift operatørene << og >>. Du kan eventuelt justere min kode for å fungere med binærtall også

post-31659-1225571975.png

Har ikke testet om dette er riktig dog, men alt i alt tror jeg du kan bare bytte ut der det står 10 med 2 istedet og bruk | istedet for +

Endret av GeirGrusom
Lenke til kommentar
Men jeg tror ikke det er dette du egentlig er ute etter

uint NewVal = tmp[0] | (tmp[1] << 8); // Flytter verdien i tmp[1] 8 bit til venstre og legger den til

skal bli 0x4d5d

 

YES!

 

Tusen takk! Var akkurat det jeg trengte!

 

Virker som en drøm :D

 

 

Dette er da koden jeg endte opp med:

		protected uint ReadBlockUInt(uint size)
	{
		uint RetVal = 0;

		//  If the given size is zero we want to calculate the correct size
		if (size == 0x00)
		{
			uint TLocation = CLocation;
			bool OneZeroByte = false;
			for (;; )
			{
				if (BinaryFile[TLocation++] == 0x00)
				{
					if (OneZeroByte == true)
						break;

					OneZeroByte = true;
				}
			}

			size = TLocation - CLocation - 2;
		}

		for (int i = 0; i < size; i++)
		{
			RetVal |= (uint)BinaryFile[CLocation++] << (i * 8);
		}

		return RetVal;
	}

Lenke til kommentar

Ikke akkurat :)

 

0x5D4D var bare ett eksempel :)

 

Skriver ett program som henter ut infoen fra headersa i COFF/PE filer.

 

Av en eller annen grunn er jo infoen lagret "baklengs" :p

 

F.eks infoen om målprosessor. Dokumentasjonen sier den for AMD64 skal være 0x8664, men da det er lagret som [0x64][0x86] og ikke [0x86][0x64] må jeg jo gjøre noe for å få det riktig i variablen jeg opprettet for å holde på tallet ...

Endret av ze5400
Lenke til kommentar

Eller så kan du bare lese den som et integer istedet for byte for byte.

Hvis du hadde brukt Bitconverter.ToUint som TheJackal sa, hadde det også fungert hehe :)

 

Grunnen er at intel prosessorer leser tall "baklengs"

 

Du burde bruke BinaryReader fremfor å lese hele fila byte for byte, da blir det litt enklere å lese.

 

Det som er litt køddent med PE exe filer, er hele RVA saken og hvordan en finner forskjellige deler av programmet.

 

Men du finner sikkert ut av det ;)

 

Lykke til

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...