AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitweises kopieren aus einem String

Ein Thema von angos · begonnen am 3. Aug 2007 · letzter Beitrag vom 8. Aug 2007
Antwort Antwort
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 13:37
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]
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 15:02
Eine blöde Frage: wozu braucht man das?
Mir fällt auf Anhieb keine Anwendungsmöglichkeit ein, aber wenn ich es mal brauchen sollte, komme ich darauf zurück
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 15:05
Zitat von DeddyH:
Eine blöde Frage: wozu braucht man das?
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 15:12
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
42
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 15:19
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ß
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 15:43
Ahja, alles klar.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Bitweises kopieren aus einem String

  Alt 3. Aug 2007, 17:15
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
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Bitweises kopieren aus einem String

  Alt 8. Aug 2007, 09:16
Hallo marabu,

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


Gruß
Ansgar
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz