unsigned long in 4 byte umwandeln

OP #3150118
Lesenswert?

Hallo,

im Moment beiße ich mir einen Zacken aus der Krone. Die Lösung ist 
bestimmt simple, ich finde aber keinen Lösungsweg. Hab schon gegoogled 
aber keinen brauchbaren Ansatz gefunden.

Zum Problem:
Ich habe mehrere unsigned long Werte die ich in einen i2c eeprom 
(24c512) speichern (loggen) möchte. Wie ich den 24c512 anspreche weiß 
ich. Ich brauche nur einen Tipp wie ich den unsigned long als C-Code in 
4 einzelne byte zerlege.

Beispiel:
unsigned long = 265896

ergebniss:

byte3 = 0x00
byte2 = 0x04
byte1 = 0xE0
byte0 = 0xA8

Hoffe mir kann einer einen Tipp geben und bedanke mich dafür schon mal 
!!
#3150122
Lesenswert?

Stefan snkrde schrieb:

> Zum Problem:
> Ich habe mehrere unsigned long Werte die ich in einen i2c eeprom
> (24c512) speichern (loggen) möchte. Wie ich den 24c512 anspreche weiß
> ich. Ich brauche nur einen Tipp wie ich den unsigned long als C-Code in
> 4 einzelne byte zerlege.

Da in dieser Anwendung die Byte-Order wahrscheinlich keine Rolle spielen 
wird, da derselbe µC die Bytes wieder zurückliest, der sie auch 
geschrieben hat, warum dann nicht einfach so
1
void writeLong( uint8_t* address, unsigned long value )
2
{
3
  writeBlock( address, (uint8_t*)&value, siezof(unsigned long) );
4
}
5

6
void writeBlock( uint8_t* adress, uint8_t* blockStart, size_t blockSize )
7
{
8
  // schreibe eine Anzahl an Bytes in das EEPROM beginnend an der
9
  // STartadresse address
10
  ...
11
}
Gast #3150199
Lesenswert?

Markus M. schrieb:
> In C/C++ ist union sehr wohl definiert.
Natürlich, aber dort wird kein Ergebnis garantiert wenn man Datentyp A 
schreibt und dann Datentyp B liest bzw. das Ergebnis ist 
implementation-defined.

In der Bibel findet sich auf S. 214 "a member of a union may not be 
inspected unless the value of the union has been assigned using that 
same member". Die dort genannte Ausnahme zieht hier nicht.
Gast #3150609
Lesenswert?

Markus M. schrieb:
> @troll
> Am besten Du testest die Funktionsweise und entscheidest dich dann dafür
> oder dagegen. Der Lerneffekt ist unbezahlbar.

troll hat da durchaus Recht.
Man macht in C so einiges unbewußt, was eigentlich nicht definiert ist, 
aber jeder C-Compiler unterstützt es.
Dann stolpert man eines Tages über so seltsame Dinge wie Aliasing und 
guckt erstmal dumm aus der Wäsche...
http://en.wikipedia.org/wiki/Strict_aliasing#Conflicts_with_optimization

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren