in byte zerlegen und wieder herstellen

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

Wenn das jemand mal erklären oder schreiben könnte
Danke

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

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

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.

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.

Nachtrag. Ich würde das überhaupt nicht in der Form implementieren. Stattdessen würde ich das ganze als union abfackeln. Also ziemlich genau so: Union in C++. Nur eben mit 4 Bytes statt mit 2.

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

Hallo
warum geht das nicht ?

    char buf[8]; 
    int Test= BIN(12);
sprintf(Buffer,"%08d",BIN(Test));
     Serial.print("  Rueckgabe ")  ;      Serial.print(buf)  ;

Danke für Infos

Hallo,
kann jetzt Binaer String erstellen.
Aber wie mache ich daraus wieder eine Zahl ?
" =( 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

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

Ratlos:
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 Bitweiser Operator – Wikipedia

so etwa:

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

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

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

 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
}

Hallo unten war noch ein fehler

das muss mit diesem ersetzt werden

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

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:

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:

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.