Forum: Compiler & IDEs 2Bytes in einem vereinen --> Binärcode


von Flo S. (tuxianer)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

> 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);

von Flo S. (tuxianer)


Lesenswert?

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 Detlev T. (detlevt)


Lesenswert?

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
Noch kein Account? Hier anmelden.