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.
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.
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
}
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.