Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitweises kopieren aus einem String (https://www.delphipraxis.net/97044-bitweises-kopieren-aus-einem-string.html)

angos 3. Aug 2007 12:37


Bitweises kopieren aus einem String
 
Der folgende Code ist dazu gedacht, teile eines strings auf bitebene kopieren. Zurückgegeben wird der Dezimalwert des kopierten strings.
Beispiel:

Delphi-Quellcode:
procedure TestThatFunction;
begin
  s := '567';
  i := BitCopyToInt(s, 6, 7);
end;
Binärcode zu 5 6 7
00000101 00000110 00000111
die Bitweise Kopie nimmt nun ab der 6. Position 7 Zeichen (rot markiert)
Der Rückgabewert ist in diesem Fall 64 + 16 = 80



Delphi-Quellcode:
uses
  Math;

Delphi-Quellcode:
// -----------------------------------------------------------------------------
// BitCopyToInt
// Erzeugt eine Bitweise Kopie von String s und gibt den daraus
// resultierenden Dezimalwert zurück
// -----------------------------------------------------------------------------
function BitCopyToInt(s: String; bitStart, bitLength: Integer): Integer;
var
  i: Integer;
  bit: Integer;
const
  bit1 = $01;
  bit2 = $02;
  bit3 = $04;
  bit4 = $08;
  bit5 = $10;
  bit6 = $20;
  bit7 = $40;
  bit8 = $80;
begin
  if ((bitStart + bitLength - 1) > (length(s) * 8)) then
    Result := -1
  else
  begin
    Result := 0;
    for i := bitStart to bitStart + bitLength - 1 do
    begin
      // index
      case i mod 8 of
        1: bit := bit8;
        2: bit := bit7;
        3: bit := bit6;
        4: bit := bit5;
        5: bit := bit4;
        6: bit := bit3;
        7: bit := bit2;
      else
        bit := bit1;
      end;
      Result := Result + IfThen((Ord(s[Trunc((i + 7) / 8)]) and bit) = bit
        , Trunc(Power(2, (bitStart + bitLength - i - 1) )), 0);
    end;
  end;
end;                                                            // BitCopyToInt
[edit=Matze]Dieses Thema reicht nicht ganz aus, um in die Code-Library aufgenommen zu werden. MfG, Matze[/edit]

DeddyH 3. Aug 2007 14:02

Re: Bitweises kopieren aus einem String
 
Eine blöde Frage: wozu braucht man das? :gruebel:
Mir fällt auf Anhieb keine Anwendungsmöglichkeit ein, aber wenn ich es mal brauchen sollte, komme ich darauf zurück ;)

Neutral General 3. Aug 2007 14:05

Re: Bitweises kopieren aus einem String
 
Zitat:

Zitat von DeddyH
Eine blöde Frage: wozu braucht man das? :gruebel:
Mir fällt auf Anhieb keine Anwendungsmöglichkeit ein, aber wenn ich es mal brauchen sollte, komme ich darauf zurück ;)

Hehe ich weiß wozu man (ich) das sehr gut gebrauchen kann... Um GIF-Bilddaten zu decodieren ist diese Funktion ganz nützlich... (siehe LZW bei Wiki)

Gruß
Neutral General

oki 3. Aug 2007 14:12

Re: Bitweises kopieren aus einem String
 
Hi,

warum nicht mit links/rechts schieben. Dann fällt alles blaue raus.
Wozu man das brauch würde mich aber auch mal interessieren.

Gruß oki

angos 3. Aug 2007 14:19

Re: Bitweises kopieren aus einem String
 
Hi,

zum Beispiel hab ich es dafür verwendet um Daten die aus einem Gerät (über Comport) ausgelesen wurden wieder "lesbar" zu machen.

In meinem Besipiel war Datum/Uhrzeit wie folgt in 4 Byte gespeichert:

6 Bits Sekunden, 6 Bits Minuten, 5 Bits Stunden, 5 Bits Tage, 4 Bits Monate, 6 Bits Jahre



Ich nehme an, dass bei diversen Hardwareansteuerungen der Code sehr nützlich sein kann :)

Gruß

DeddyH 3. Aug 2007 14:43

Re: Bitweises kopieren aus einem String
 
Ahja, alles klar. :mrgreen:

marabu 3. Aug 2007 16:15

Re: Bitweises kopieren aus einem String
 
Hallo Ansgar,

ist jetzt völlig off-topic, aber dein Beispiel mit dem Timestamp der externen Hardware: so sieht ein DOS-Timestamp aus, wenn man ihn um ein Bit nach links schiebt um die Sekundenauflösung von zwei auf eins zu erhöhen.

Delphi-Quellcode:
uses
  DateUtils; // OneSecond

function TimeStampToDateTime(ts: DWORD): TDateTime;
begin
  Result := FileDateToDateTime(ts shr 1) + OneSecond * Ord(Odd(ts));
end;
So oder ähnlich geht das dann vielleicht auch.

Freundliche Grüße

angos 8. Aug 2007 08:16

Re: Bitweises kopieren aus einem String
 
Hallo marabu,

das werd ich mir auch nochmal anschauen. danke fürs OT


Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz