ze5400 Skrevet 31. oktober 2008 Del Skrevet 31. oktober 2008 (endret) 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 31. oktober 2008 av ze5400 Lenke til kommentar
The Jackal Skrevet 31. oktober 2008 Del Skrevet 31. oktober 2008 (endret) BitConverter.ToUInt32(bytearray,0); Edit: scratch that...leste posten din litt kjapt ^^ Tror du må om string da gitt. Endret 31. oktober 2008 av The Jackal Lenke til kommentar
Svish Skrevet 31. oktober 2008 Del Skrevet 31. oktober 2008 kan jo ta posisjon 1 verdi + (posisjon 2 verdi * 100) eller noe sånt? men tror nok kanskje veien om string er den enkleste. om det ikke er en veldig god grunn til å ikke gå om den da... Lenke til kommentar
Alexen Skrevet 1. november 2008 Del Skrevet 1. november 2008 (endret) 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 Endret 1. november 2008 av The_Viper@EFNET Lenke til kommentar
GeirGrusom Skrevet 1. november 2008 Del Skrevet 1. november 2008 (endret) public uint AppendNumber(uint val, uint num) { return val + Mat.Pow(10, val / 10) * num; } Endret 1. november 2008 av GeirGrusom Lenke til kommentar
ze5400 Skrevet 1. november 2008 Forfatter Del Skrevet 1. november 2008 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 ) Metoden til The_Viper er vel i grunn metoden til Svish, bare litt proppa av if/else. Enhver sin smak 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 ) 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
ze5400 Skrevet 1. november 2008 Forfatter Del Skrevet 1. november 2008 (endret) Skit au. Det enkle er ofte det enkle 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 1. november 2008 av ze5400 Lenke til kommentar
GeirGrusom Skrevet 1. november 2008 Del Skrevet 1. november 2008 (endret) 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 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 Endret 1. november 2008 av GeirGrusom Lenke til kommentar
Svish Skrevet 1. november 2008 Del Skrevet 1. november 2008 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 Lenke til kommentar
GeirGrusom Skrevet 1. november 2008 Del Skrevet 1. november 2008 Hmmmm er det ikke det jeg gjør? :S Vel, jeg laget ihvertfall en matteformel å jobbe utifra, som kanskje beskriver koden enklere en koden selv. v = sluttresultatet v_i er inn argumentet i_v er antall innargumenter. Lenke til kommentar
ze5400 Skrevet 1. november 2008 Forfatter Del Skrevet 1. november 2008 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 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
GeirGrusom Skrevet 1. november 2008 Del Skrevet 1. november 2008 (endret) 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å 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 1. november 2008 av GeirGrusom Lenke til kommentar
ze5400 Skrevet 1. november 2008 Forfatter Del Skrevet 1. november 2008 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 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
GeirGrusom Skrevet 2. november 2008 Del Skrevet 2. november 2008 Hele saken din får meg med en gang til å tenke på .3ds filer, med tanke på 0x4d5d som vel er en scene chunk eller noe slikt, og det at du flytter om på byte rekkefølgen. Stemmer det? Lenke til kommentar
ze5400 Skrevet 2. november 2008 Forfatter Del Skrevet 2. november 2008 (endret) 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" 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 2. november 2008 av ze5400 Lenke til kommentar
GeirGrusom Skrevet 2. november 2008 Del Skrevet 2. november 2008 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
Svish Skrevet 2. november 2008 Del Skrevet 2. november 2008 har vel med big endian og little endian osv å gjøre? mener å huske vi lærte om noe sånt en gang -> http://en.wikipedia.org/wiki/Endianness Lenke til kommentar
GeirGrusom Skrevet 2. november 2008 Del Skrevet 2. november 2008 Stemmer det, det er bare det at jeg aldri husker hva som er hva :S Lenke til kommentar
Manfred Skrevet 3. november 2008 Del Skrevet 3. november 2008 Jeg tror det er slikt man bare glemmer med en gang Latterlig mye fra utdannelsen min som absolutt ikke sitter igjen... Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå