Teile eines Array auswerten

Hallo

Vielleich hat jemand von euch eine Idee oder Hinweis.

Ich bekomme aus eine Microcontroller Datenpakete. Diese liegen zwischen 1 und 4 Bytes. Aus diesen soll ab einen Startbit (BitOffset) auf eine Länge (BitSize) Daten herausgeschnitten werden.

Beispiel (Bytes=2, BitOffset=4,BitSize=4)
00110010 01011011 -> 0010

Mein bisheriger Code

byte test01[4]={0x30,0x33,0x22,0x11};
Serial.println(ByteToLong(test01,1,8),BIN);


unsigned long ByteToLong( byte const *bp, byte BitOffset, byte BitSize)
{

  //**** Ermittelt Anzahl der Byte auf Basis des Startbits und der Laenge der Bitstring
  byte c=((BitOffset+BitSize)/8);
  (c) - (int)(c) > 0.0 ? (int)(c) + 1 : c;


  //**** Init Long
  unsigned long value = 0;   


  //**** Kopiert Byts in Long 
  memcpy( &value, bp, c );

  
  //**** Bitverschiebung
  value<<=32-(BitOffset+BitSize);
  value>>=32-BitSize;

  return(value);
}
  1. Ein Array wird an *bp übergeben.
  2. Aus BitOffset und BitSize die notwendige Länge der Bytes welche verwendet wird (BUG)
  3. memcpy kopiert alles in eine ulong
  4. Bitverschiebung mit Basis 32 da es sich um eine Long handelt.

Das ganze klappt so nicht, wer hat eine Tipp für mich wie es richtig funktioniert (oder eine Quellcode) - vielleicht denke ich zu umständlich.

vielen Dank im Voraus.

Die Lösung (Zusammenfassung):

USE CAse:
Aus einen Array von 1-4 Bytes werden Abschnitte mit Startbit (BitOffset)
und Länge (BitSize) herrausgeschnitten. Der Wert wird als uL ausgegeben.

Die Minimalcode Variation:

/**
* Wandel Array zwischen 1-4 Bytes in Long und schneidet Bit Abschnitte von diesen heraus
* @V0.3      2011.09.20
*/
unsigned long ByteToLong( byte const *bp, byte BitOffset, byte BitSize)
{ 
  unsigned long value=0;
  byte c = ( BitOffset + BitSize ) / 8;
  c * 8 == BitOffset + BitSize ? 0 : c++;
 
  memcpy ( &value, bp, c );

  value <<= ( sizeof ( value ) - c ) * 8 + BitOffset;
  value >>= 8 * sizeof ( value ) - BitSize;

  return value;
}