Pages: [1]   Go Down
Author Topic: in byte zerlegen und wieder herstellen  (Read 1282 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
warum ist der zürückgegebene Wert nicht richtig.
( Bei über 32000 )

Wenn das jemand mal erklären oder schreiben könnte
Danke
Code:
unsigned long OperationHours = 320000; // Rückwert falsch
//unsigned long OperationHours = 32000; // Rückwert richtig
    // Test für Speichern der Betriebsstunden
    byte STD1=0;
    byte STD2=0; 
    byte STD3=0;
    byte STD4=0;
void setup()
{
  Serial.begin(9600);        // Seriale Schnittstelle Datenrate
}
  void loop()
  {
     STD1 = (byte)( (OperationHours >> 24));
     STD2 = (byte)((OperationHours >> 16)); 
     STD3 = (byte)((OperationHours >> 8)) ;
     STD4 = (byte) OperationHours ;

  unsigned long int    STD =  ((STD1 & 0xFF )<< 24) +
                           ((STD2 & 0xFF )<< 16)  +
                            ((STD3 & 0xFF )<< 8) +
                            (STD4 & 0xFF ) ;
                           
    long value = (unsigned long)(STD1 << 24) | (STD2 << 16) | (STD3 << 8) | STD4;
         Serial.print("  Rueck value ")  ;      Serial.print(value)  ;
            Serial.print("            ")  ;             
   Serial.print(" Original  "); Serial.print(OperationHours);
      Serial.print(" Rueck STD "); Serial.print(STD);
     // Ende Test Betriebsstunden
      delay(5000); 
}
Logged

Germany
Offline Offline
Edison Member
*
Karma: 47
Posts: 2320
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du reagierst nicht auf die Antworten in deinem Thread und fragst einfach nochmal? Ganz schön frech...

http://arduino.cc/forum/index.php/topic,141836.msg1064934.html
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo sth77,
das hatte ich alles schon ausprobiert.
Jetzt habe ich das unter ein besseren Subject gestellt.
Den bei dem Anderen war es nicht gut formuliert.

Werde mich mehr zurückhalten was zu fragen, möchte ja nicht frech sein.
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3482
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Es reicht nicht, daß die linke Seite groß genug ist um das Ergebnis aufzunehmen. Die rechte Seite muß auch schon mit unsigned long int rechnen.  D.h. ich würde an Deiner Stelle die Bytes vor dem Shift mit (unsigned long int) casten.
Logged

Check out my experiments http://blog.blinkenlight.net

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3482
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nachtrag. Ich würde das überhaupt nicht in der Form implementieren. Stattdessen würde ich das ganze als union abfackeln. Also ziemlich genau so: http://www.willemer.de/informatik/cpp/union.htm. Nur eben mit 4 Bytes statt mit 2.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
Wenn ich auch die "byte" in  "unsigned long" ändere geht es.
das kann es aber nicht sein.
Bei dem anderen Udo komme ich geistig nicht mit.

Warum kann ich nicht einfach byte zb.

00100000 & 00000000 & 010100110   Zusamensetzen  ??
= 0010000000000000010100110
So das 4194470 DEZ raus kommt


Es wird leider so zusammengefügt ( war ja falsch ist )
100000 & 0 & 10100110
=100000010100110
=16550 DEZ

Gibt es eine einfach Möglichkeit ?
Danke
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo
warum geht das nicht ?
Code:
    char buf[8];
    int Test= BIN(12);
sprintf(Buffer,"%08d",BIN(Test));
     Serial.print("  Rueckgabe ")  ;      Serial.print(buf)  ;

Danke für Infos
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
kann jetzt Binaer String erstellen.
Aber wie mache ich daraus wieder eine Zahl ?
smiley-cry man ist das schwer für ein normalbürger"

Hier mal ein Code wo dann myStr1 wieder eine zahl werden muss

Danke für Hilfen

Code:
nt meineNum = 4;
int nullen = 8 - String(meineNum,BIN).length(); // Fuehrende Nullen feststellen
String myStr; // Variabele für die 0 eintraege
for (int i=0; i<nullen; i++) {myStr = myStr + "0";} //Schleife in der die 0len in ein String gebracht werden
myStr = myStr + String(meineNum,BIN); // jetzt ist es 8 Zeichen lang und Binär (byte)   
Serial.println(myStr); // Ausgabe Binaer
Serial.println("CR"); // LF
Serial.print(" myStr  ") ; Serial.print(myStr)  ; // wir BINAER 4 angezeigt
   Serial.println("CR"); // LF
String myStr1 =  myStr + "00000100";    // ist DEZ 514
   Serial.print(" myStr1  ") ; Serial.print(myStr1); //Wie kann "514" ich das jetzt anzeigen ?
   Serial.println("CR"); // LF
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Warum kann ich nicht einfach byte zb.

00100000 & 00000000 & 010100110   Zusamensetzen  ??
= 0010000000000000010100110
So das 4194470 DEZ raus kommt

Es wird leider so zusammengefügt ( war ja falsch ist )
100000 & 0 & 10100110
=100000010100110
=16550 DEZ

Was absolut korrekt ist - 8x0 bzw 128x0 ist eben immernoch null. wenn du eine 8-nullen in den Bitstream einbringen willst, muss du es über eine Verschiebung machen, nicht über eine Verknüpfung.

siehe http://de.wikipedia.org/wiki/Bitweiser_Operator
« Last Edit: January 14, 2013, 10:10:12 am by Marcus W » Logged


Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so etwa:

Code:
a1=00100000;
a2=00000000;
a3=010100110;

a = (a1 << 8 | (a2 << 16) | a3;
Logged


Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
Danke Dir Marcus.
habe es mal so gemacht
vieleicht kann man das ja noch abkürzen ?

vieleicht kann das der eine oder andere gebrauchen beim Speichern in das EEprom

Code:
long int OperationHours = 815320159; // Rueckwert OK

byte arr[4] ;                 // Speichern der bytes einer DEC Zahl
void setup()
{
  Serial.begin(9600);        // Seriale Schnittstelle Datenrate
}
  void loop()
  {
     arr[0] = ((OperationHours) >> 24); // aufspliten in  bytes
     arr[1] = (OperationHours >> 16);   // aufspliten in  bytes
     arr[2] = (OperationHours >> 8) ;   // aufspliten in  bytes
     arr[3] = (OperationHours) ;        // aufspliten in  bytes

String myStra = "", myStr = ""; int nullen = 0 , ii=0 ; // Variabeln zuweisen

// Schleife um alle 4 arr abzuarbeiten
while ( ii < 4 ) {
    nullen = 8 - String(arr[ii],BIN).length();           // Fuehrende Nullen feststellen
    myStr = "" ;                                         // Schleife um alle 4 arr abzuarbeiten
    for (int i=0; i<nullen; i++) {myStr = myStr + "0";} //Schleife in der die 0len in ein String gebracht werden
    myStra = myStra + myStr + String(arr[ii],BIN);      // jetzt ist es 8 Zeichen lang und Binär (byte)
  ii++ ;    // hochzaehlen     Schleife um alle 4 arr abzuarbeiten
}           // Ende Schleife um alle 4 arr abzuarbeiten

// ende Routine um bytes zusammen zu fügen
   Serial.print(" myStralles  ") ; Serial.print(myStra); //Wie kann "514" ich das jetzt anzeigen ?
   Serial.println("CR"); // LF
  Serial.print(" Original      "); Serial.print(OperationHours,BIN);
   Serial.println("CR");

// Routine um wieder eine DEZIMAL Zahl zu erstellen
long int wert;                            // Routine um wieder eine DEZIMAL Zahl zu erstellen
int i = 0;                                // Routine um wieder eine DEZIMAL Zahl zu erstellen
  for (wert=i=0; myStra[i] != '\0'; i++)  // Routine um wieder eine DEZIMAL Zahl zu erstellen
    wert=wert*2+myStra[i]-48;             // Routine um wieder eine DEZIMAL Zahl zu erstellen
 printf("\nDezimaler Wert: %ld",wert);    // Routine um wieder eine DEZIMAL Zahl zu erstellen
 // Ende Routine um eine Dezimalzahl herzustellen
 
 
Serial.print(" wert  ") ; Serial.print(wert) ;
   Serial.println("CR"); // LF
   Serial.print("Owert  ") ; Serial.print(OperationHours) ;
   Serial.println("CR"); // LF

Serial.print("Std "); Serial.print(wert/60);Serial.print(" min ");Serial.print(wert % 100);
Serial.println("CR");
      delay(5000);      // Warten ms
}
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 93
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo unten war noch ein fehler

das muss mit diesem ersetzt werden
Code:
Serial.print(" wert  ") ; Serial.print(wert) ;
   Serial.println("CR"); // LF
   Serial.print("Owert  ") ; Serial.print(OperationHours) ;
   Serial.println("CR"); // LF
wert = wert * 60 ;
Serial.print("Std "); Serial.print(wert/3600);Serial.print(" min ");Serial.print((wert- (wert / 3600)*3600 ) / 60);
Serial.println("CR");
      delay(5000);      // Warten ms
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 58
Posts: 3043
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
vieleicht kann man das ja noch abkürzen ?

Du solltest wirklich versuchen, union ( aus Udo's Vorschlag) zu verstehen.

Wenn das Ziel ist, einen Speicherbereich wahlweise als unsigned long oder als byte array zu sehen, ist union wirklich die beste "Abkürzung"

Beides geht:
A:
Code:
union {unsigned long UL; byte B[4];} OperationHours;
OperationHours.UL = 0x12345678;

Serial.println( OperationHours.UL );  // liefert    305419896  ( Dezimalwert )
for (byte i=0; i < 4; i++) {
  Serial.print(" 0x"); Serial.print(OperationHours.B[i],HEX);
}    // liefert die einzelnen Bytes: 0x78  0x56 0x34 0x12 

B:
Code:
union  {unsigned long operationHours; byte array[4];} data;

data.operationHours = 305419896; //  ( Dezimalwert )
Serial.println (data.array[0]);  // Dezimalwert des niedrigwertigsten Bytes  ( 120 = 0x78 )

Was das ganze (für Informatiker) verkompliziert -- und dich evtl. in Udo's Link abschreckt -- , ist die Sache dass die Reihenfolge der einzelnen Bytes in einer größeren Variable vom Prozessor abhängt. Aber da du ja nicht vom Arduino auf einen anderen Maschinentyp transportieren willst, sondern da wiederherstellen wo es herkam, ist das kein Problem.
Logged

Pages: [1]   Go Up
Jump to: