Hallo ich bin ein Megaanfänger, der Byte Arrays in Integer umwandeln will und trotz hochentwickelten Neuheiten wie "Google" usw...nicht in der Lage ist. Hintergrund: ich will ein paar Byte arrays addieren, das Ergebnis soll dann ebenfalls in einem Byte array gespeichert werden. ( Sprache c# ) z.b. Ergebnis[0] = byte[0] + byte[1] + byte[2]; Ich bin zwar nur gelernter Metzger, aber "Ergebnis[0]" müsste ja erst Integer sein und dann in byte gewandelt werden?! Davor müssten die byte arrays natürlich zu Integer gewandelt werden!? Mich haben die ganzen Foren, die ich seit heut Morgen durchforste, ziemlich verwirrt Bevor ihr mich auf andere Seiten verweist, tippt lieber kurz nen Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im Web, die sich damit beschäftigt!! Gruß
:
Verschoben durch Moderator
Jean schrieb: > Bevor ihr mich auf andere Seiten verweist, tippt lieber kurz nen > Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im > Web, die sich damit beschäftigt!! Auch die, auf denen man die Grundlagen der C-Programmierung lernt?
1 | unsigned int ergebnis; |
2 | |
3 | ergebnis = (byte[0] << 0) | (byte[1] << 8) | (byte[2] << 16) | (byte[3] << 24) ; |
Jean schrieb: > Beispiel für mich runter, ich kenn nämlich schon ( fast ) jede Seite im > Web, die sich damit beschäftigt!! Du solltest besser in die nächste Buchhandlung gehen und dir ein C# Buch kaufen. Da hast du meistens mehr davon, als wenn du dir im Web anlassbedingt Halbwissen zusammensammelst. Gerade bei der ersten Programmiersprache sind die Grundlagen das um und auf. Alles hängt irgendwie über 5 Ecken mit allem anderen zusammen und diese Zusammenhänge versteht man nur dann wenn man systematisch an die Sache ran geht. Bücher tun das. Da hat sich jemand einen systematischen Weg ausgedacht, wie er in kleinen Schritten vom einfachen zum Schwierigen kommt ohne den Leser zu überfordern und ohne dass zunächst Unlogikeiten ins Spiel kommen. Web-Seiten (und auch Web-Tutorials) tun das in den wenigsten Fällen.
Danke für die schnelle Hilfe, aber ich hab jetzt folgendes gemacht: int ergebnis
1 | |
2 | byte[] byte = new byte[7]; |
3 | byte[] erg = new byte[1]; |
4 | |
5 | byte[0] = 0x10; |
6 | byte[1] = 0x20; |
7 | byte[2] = 0x40; |
8 | byte[3] = 0x80; |
9 | |
10 | ergebnis = (byte[0] << 0) | (byte[1] << 8) | (byte[2] << 16) | (byte[3] << 24) ; |
11 | |
12 | byte[] erg = System.BitConverter.GetBytes(ergebnis); |
in das array "erg" soll dann das ergebnis in hex geschrieben werden, ich muss aber noch definieren wo genau oder?! z.b. erg[0] oder ? zumindest kommen mal kein Fehler, aber richtig funktionieren tuts auch nicht. @ kbuchegg hast Recht, aber im Moment gehts wirklich nur um diese Kleinigkeit, wenn ich tiefer in die Richtung gehe, dann mach ich das natürlich.. Gruß
> Danke für die schnelle Hilfe, aber ich hab jetzt folgendes gemacht:
Da machst Du aber etwas komplett anderes als in Deinem
Ursprungsbeitrag.
Wie wäre es, wenn Du Dich mal mit Deiner Aufgabenstellung beschäftigen
würdest und versuchst, herauszufinden, was Du eigentlich erreichen
willst?
> Ergebnis[0] = byte[0] + byte[1] + byte[2];
Wenn du 3 Werte aus einem Zahlenbereich von 0 bis 255 addierst,
kommt ein Ergebnis von 0..765 raus, Ergebnis muß also in der
Lage sein, so grasse Zahlen auch aufzunehmen, also wenigstens
ein short, eventuell ein int oder long, wobei die jeweils
unsigned variante reichen würde, negative Werte können nicht
auftreten.
Wenn Ergebnis[0] ein byte ist, wird eventeull was abgeschnitten,
das tut C# nicht unbemerkt automatisch, sondern nur wenn du das
explizit so sagst:
Ergebnis[0] = (byte)(byte[0] + byte[1] + byte[2]);
Danke MaWin, genau sowas hab ich gesucht. Mein Ergebnis kann theoretisch nie größer als 255 sein, von daher passt das so Gruß
Mal so ein Tip: Wenn du statt byte doch int nimmst läuft dein Programm ein bisschen schneller, da eine nBit Cpu mit einem nBit Wert am schnellsten rechnen kann (int ist auf einer 32bit CPU ein 32bit interger und auf 64bit ein 64bit Int). Bei dir wird das warscheinlich egal sein. Aber wenn dein Programm nur rechnet, bringt es einen kleinen Geschwindigkeitsbonus. (genauso wird double schneller gerechnet als float). -> Lange Rede kurzer Sinn: Speicher ist nicht mehr teuer, nimm einfach int und du musst dir keine Sorgen über einen Überlauf oder irgendwelchen Konvertierungen machen.
Ich hab das mal in c# getestet: Das ganze mit Optimierung: Bei 1mrd Rechnungen erreicht int seinen Höhepunkt mit ca. 1.5% weniger Zeit. Bei 10mrd sind es nur noch ca. 0,05%. Bei 100mrd sind es -0,2%???. Ich weiß nicht woran das liegt, aber wenn ich das Programm sowohl bei int und byte nur bis 100 rechnen lasse und dann wieder von 0 anfange ist int immer ca. 40% schneller. Ich hab aber nur hochzählen lassen. Bei Multiplikation müsste das anders aussehen.
ich würde behaupten das diese 1,5% im Rahmen des scheduling-bedingten Rauschen liegt. Zumal der Compiler einen Großteil der Berechnungen optimieren wird, wenn du direkt davor Konstanten zuweist.
Samuel K. schrieb: > ne nBit Cpu mit einem nBit Wert am > schnellsten rechnen kann (int ist auf einer 32bit CPU ein 32bit interger > und auf 64bit ein 64bit Int). In c# ist das nicht so dort ist int immer ein 32 Bit Wert. fz
Ist ja wirklich so. Sry hab ich nicht gewusst. Was macht der Compiler denn, wenn man auf 64bit compiliert. Das wird doch langsamer. Vlad Tepesch schrieb: > ich würde behaupten das diese 1,5% im Rahmen des scheduling-bedingten > Rauschen liegt. Also stimmen tut es aufjedenfall, schließlich steht es in einem ProgBuch von mir. Aber ich wollte aber nicht mit Zufallszahlen rechnen, da ich keine Ahnung habe wie diese Random.Next Methode arbeitet. Am Ende wird sie verschieden schnell augeführt wird. Wie erklärst du das Verhalten wenn man if(i > 100) i = 0; einfügt, es 40% schneller ist? Hat jmd vielleicht lust den Test mal in c++ zu machen? Ich hab bisher in c++ nur spiele mit allegro programmiert. Deswegen weiß ich auch nur wie man Allegro benutzt, Vectoren und listen nutzt usw. Aber nicht wie man zeit stoppt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.