Ich vermute in der Methode noch Fehler.
Code:
LBitOffset = 11
LBiCount = 18
Byte 0------- 1------- 2------- 3-------
Bits 01234567 89012345 67890123 45678901
Info 00000000 00010000 11111101 11111000
$00 $08 $BF $1F
Erg. 10000111 11101111 11000000 00000000
$E1 $F7 $03 $00
Ergebnis sollte meiner Meinung nach $0003F7E1 sein, tatsächliches Ergebnis $000117E3.
Scheinbar werden am Anfang und Ende die falschen Bits ausgewählt und auch die Reihenfolge der Byte LSB..MSB stimmt nicht.
Delphi-Quellcode:
const
FData:
array[0..3]
of Byte = ($00, $08, $BF, $1F);
function TBaseData.GetData(
const Index : integer ) : integer;
var
LBitCount : integer;
LBitOffset : integer;
LByteOffset : integer;
LByteIdx : PByte;
LMask : integer;
LShift: integer;
begin
LBitCount :=
Index and $FF;
if LBitCount > 32
then
raise EArgumentOutOfRangeException.CreateFmt( '
Index %x contains invalid BitWidth %x', [
index, LBitCount] );
if LBitCount = 0
then
begin
Result := 0;
Exit;
end;
LBitOffset := (
Index shr 8 )
and $FFFFFF;
LMask := $FFFFFFFF
shr ( 32 - LBitCount );
LByteOffset := LBitOffset
div 8;
LBitOffset := LBitOffset
mod 8;
{ RangeCheck for LByteOffset }
if (Length(FData) - LByteOffSet) < ((7 + LBitCount)
div 8)
then
raise EArgumentOutOfRangeException.CreateFmt( '
Index %x contains invalid BitOffset %x for BitWidth %x', [
Index, LBitOffset, LBitCount] );
LByteIdx := @FData[LByteOffset];
Result := LByteIdx^
shr LBitOffset;
LShift := ( 8 - LBitOffset );
Dec( LBitCount, LShift);
Inc( LByteIdx );
while LBitCount > 0
do
begin
{$R-}
Result := Result
or (Integer(LByteIdx^)
shl LShift);
{$R+}
Inc( LShift, 8);
Dec( LBitCount, 8);
Inc( LByteIdx );
end;
Result := Result
and LMask;
end;