AGB  ·  Datenschutz  ·  Impressum  







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

Datentypen von String zu Byte und wieder zurück

Ein Thema von Graw · begonnen am 27. Apr 2017 · letzter Beitrag vom 6. Jun 2017
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#1

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 13:29
Ich verstehe das so, daß du die beiden Hex-Strings bitweise verschachtelst. Folgende Funktion sollte das leisten:

Delphi-Quellcode:
function Convert(const A, B: string): string;

  function Merge(CA, CB: Char): string;
  type
    TByteSet = set of 0..3;
  var
    BS: TByteSet;
    b1: Byte;
    b2: Byte;
    I: Integer;
  begin
    b1 := StrToInt('$' + CA);
    b2 := StrToInt('$' + CB);
    BS := [];
    for I := 0 to 3 do begin
      if I in TByteSet(b1) then begin
        Include(BS, 2*I);
      end;
      if I in TByteSet(b2) then begin
        Include(BS, 2*I + 1);
      end;
    end;
    Result := IntToHex(Byte(BS), 2);
  end;

var
  I: Integer;
begin
  Assert(Length(A) = Length(B), 'Strings müssen gleich lang sein!');
  Result := '';
  for I := 1 to Length(A) do begin
    Result := Result + Merge(A[I], B[I]);
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Graw

Registriert seit: 26. Apr 2017
78 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 15:08
Hallo Uwe,

deine Funktion ist genau das was ich gebraucht habe.
Vielen Dank!!!

Wenn ich zwei feste Strings in die Funktion eintrage kommt genau das Ergebniss welches ich mir erhofft habe.

Die Strings die von der Schnittstelle kommen will er leider noch nicht verarbeiten...
Da hab ich irgendwo noch nen Fehler...

Aber den soll ich wohl noch finden.

Nochmal vielen Dank!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#3

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 17:42
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein.


Deine Beschreibung war in #1 nicht so gut.
Für mich klang das auch so, als wenn du jeweils "ein Hex-Zeichen" mischen willst und nicht die einzelnen Bits.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
781 Beiträge
 
#4

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 19:55
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein.
Kam mir auch komisch vor. Aber habe es gerade mal im Debugger gecheckt: Der tut da anstandslos mehr rein als deklariert ist.

Also wenn ich doppelt so viele Bit trinke, wie ich eigentlich vertrage, dann kommt es bei mir zu einem Überlauf...
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 21:01
Ja, immer wieder spannend was man so alles in eine einfache Menge packen kann .

Ich nehm mal an, dass das viele Delphianer nicht wissen und UR uns allen damit wieder einmal zeigen wollte, was Delphi so alles kann .

Schnell ist das aber nicht.

Wenn viele Daten anfallen / Tempo eine Rolle spielt, dann kann man es auch so machen:

Delphi-Quellcode:
var merger : array[0..15,0..15] of string;
    hti : array[ '0'..'F' ] of integer;

function ConvertA(const A, B: string): string;
var i : integer;
begin
  Assert(Length(A) = Length(B), 'Strings müssen gleich lang sein!');
  Result := '';
  for i := 1 to length(A) do Result := Result + merger[hti[A[i]],hti[B[i]]];
end;
Das ist auf meiner Kiste über 16 Mal schneller und da die beiden Algos O(n) sind, ist das wohl auch auf langsameren und schnelleren Kisten so.
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 22:02
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein.
Gut erkannt! TByteSet muss natürlich so deklariert sein:

Delphi-Quellcode:
  type
    TByteSet = set of 0..7;
Übrigens: Das funktioniert deshalb, weil Delphi immer ganze Bytes für Sets reserviert.

Schnell ist das aber nicht.
Klar, daß man das mit einer Lookup-Tabelle deutlich schneller laufen lassen kann (deren Aufbau hast du ja auch weg optimiert - alternativ als const deklarieren). Es ging mir hier aber im Wesentlichen darum, den beschriebenen Algorithmus möglichst exakt nachzubilden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datentypen von String zu Byte und wieder zurück

  Alt 27. Apr 2017, 22:35
Ja, Natürlich kann man nur auf ganze Bytes zugreifen und Delphi rundet immer auf.
Ein Boolean kennt auch 1x False und 255x True

Aber blöd wird es, wenn man die Bereichsprüfung mal aktiviert und dann der Typ zu klein deklariert ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#8

AW: Datentypen von String zu Byte und wieder zurück

  Alt 28. Apr 2017, 08:13
Das ist sogar noch witziger:
Delphi-Quellcode:
type
  TSet = set of 0..3;

procedure Main;
var
  s: TSet;
  I: 0..3;
begin
  s := [1,3];
  for I in s do
  begin // <== BreakPoint 1
    Writeln(I); // <== BreakPoint 2
  end;
end; // <== BreakPoint 3
BreakPoint 1 wird 8x durchlaufen! BreakPoint 2 erwartungsgemäß nur 2x.

Bei den Durchläufen vor dem ersten Writeln hat I nicht mal einen definierten Wert.
Angehängte Grafiken
Dateityp: png 28-04-_2017_09-08-28.png (12,7 KB, 14x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Graw

Registriert seit: 26. Apr 2017
78 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Datentypen von String zu Byte und wieder zurück

  Alt 28. Apr 2017, 09:43
Leider bekomm ich es doch nicht ans laufen...

Wenn ich der Funktion feste Werte übergebe funktioniert sie wunderbar.
Code:
PBuf := Convert('00003FFFC000','00003FFFC000');
Wenn ich aber meine Buffer der Funktion übergebe kommt nichts aus ihr raus.
Code:
BEGIN

          PBuf1 := Copy(PBuf10,13,Length(PBuf10)-3);
          PBuf2 := Copy(PBuf20,13,Length(PBuf20)-3);


          if (length(PBuf1) = length(PBuf2)) then
          begin
           PBuf := Convert(PBuf1,PBuf2);
           PBufSend := PBuf;        
          end;
         
END;
Könnt ihr mir sagen was ich da falsch mache?
  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 05:01 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