Hallo, und zwar brauche ich für ein Projekt diese Umwandlung. Ich habe in einem Array 2 Zahlen. Byte1 ist die erste Stelle einer Zahl Byte2 die 2. und 3.. Diese sind als Hexcode eingegeben, das dürfte ja aber kein Problem sein. Nun möchte ich die Zahl im Gesamten in Binärcode umwandeln. Dafür habe ich ein Array von 8 Feldern. Das ganze soll nur für zahlen bis 256 funktionieren, dass wäre ausreichend. In einem weiteren Byte steht der Exponent.Hier mal ein Beispiel Byte1: 2 Byte2: 46 Zahl: 246 Byte1:2 Byte2:4 Zahl=24 Ich dachte mir das so ich unterscheide zwischen Byte2<10 und dem Rest. Bei kleiner als 10 wird Byte1 mal 10 genommen und Byte2 addiert. (2*10)+4=24 bei Zahlen größer gleich 10: (2*100)+46=246. Das müsste ja so klappen. Nun möchte ich diese Zahlen nur noch in Binärcode umwandeln, und dann bitweise in ein Array schreiben. Das ich dann folgendes Array habe bei 246: {1,1,1,1,0,1,1,0}. Bietet dafür GCC schon eine fertige Funktion? Nun weis ich noch nicht, wie ich am besten die Sonderfälle der 10er Reihe behandle. Da muss ich den Exponent noch in meine Rechnung einfließen lassen. Viele Grüße Florentin.
> Byte1:2 > Byte2:4 > Zahl=24 Wie willst Du denn da zwischen 24 und 240 unterscheiden? Das kann so nicht funktionieren. Wenn ich das erste Beispiel richtig interpretiere, dann stellen jeweils 4 Bit eine Dezimalstelle dar. Das ganze nennt sich gepackter BCD-Code. Wenn das ganze "rechtsbündig" dargestellt ist, wie im ersten Beispiel oben mit der 246, dann ist es ziemlich simpel: - letzte Stelle (Einer) 1:1 übernehmen - vorletzte Stelle mit 10 multiplizieren (Ursprungswert um 4 Bitstellen nach rechts schieben und dann multiplizieren, wenn Ausgangswert signed, dann vor dem Multiplizieren noch die 4 MSB ausmaskieren) - erste Stelle mit 100 multiplizieren - alles zusammenaddieren und fertig.
1 | include <stdint.h> |
2 | uint8_t high, low; |
3 | uint8_t result; |
4 | |
5 | result = (high & 0x0f)*100 + (low >> 4)*10 + (low & 0x0f); |
also ich hatte im ersten post geschrieben ich habe 3 Bytes Byte1 ist die erste Stelle Byte2 die 2. und 3. Stelle Byte3 den Exponenten http://www.frangenberg.info/zeug/GTRprotokoll hier das Protokoll, um welches es geht. Ich brauche nur Zahlen zwischen 0 und 256 und nur mit positiven Vorzeichen, also alles, was in ein byte reinpasst. Deine Lösung war ja ohne Berücksichtigung des Exponenten. Also die 24 wird gespeichert als 2,4e+01 die 240 als 2,4e+02
Von so einem bescheuerten Protokoll habe ich vorher noch nie gehört. Ich sehe da eigentlich nur die Möglichkeit, die ganzen Ausnahmen einzeln abzuarbeiten.
1 | char ergebnis; |
2 | char i, mask; |
3 | char array[8]; |
4 | |
5 | switch(byte3) |
6 | {
|
7 | case 0: ergebnis = byte1; |
8 | break; |
9 | case 1: if(byte2 > 9) byte2 /=10; |
10 | ergebnis = byte1 * 10 + byte2; |
11 | break; |
12 | case 2: if(byte2 < 10) byte2 *=10; |
13 | ergebnis = byte1 * 100 + byte2; |
14 | }
|
15 | |
16 | mask = 0x80; |
17 | for(i=0; i<8; i++) |
18 | {
|
19 | array[i] = (mask & ergebnis)?1:0; |
20 | mask >>=1; |
21 | }
|
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.