Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Datentypen von String zu Byte und wieder zurück (https://www.delphipraxis.net/192538-datentypen-von-string-zu-byte-und-wieder-zurueck.html)

Graw 27. Apr 2017 13:05

Datentypen von String zu Byte und wieder zurück
 
Hi,

ich hoffe ihr könnt mir helfen.
Also folgendes, ich bekomme über eine Schnittstelle zwei Strings. Die sehen zum Beispiel so aus:

1. Datensatz: 003F800
2. Datensatz: 001FC00

Die einzelnen Zeichen in dem String muss ich nun so umformen, das ich die hex Zeichen im String zu Binary umforme:

1. Datensatz: 0000|0000|0011|1111|1000|0000|0000
2. Datensatz: 0000|0000|0001|1111|1100|0000|0000

Diese beiden Datensätze muss ich dann zu einem zusammenfügen.
Dazu nehme ich das erste Zeichen von Datensatz 2 dann das erste von Datensatz 1 dann das zweite von Datensatz 2 usw.

1 u. 2 zusammen: 0000|0000|0000|0000|0000|0111|1111|1111|1110|0000| 0000|0000|0000|0000

Und dann wieder umwandeln in einen String mit den Hex Werten

1 u. 2 zusammen: 0|0|0|0|0|7|F|F|E|0|0|0|0|0


Ich hoffe ich habe das verständlich erklärt.
Im Voaraus schonmal vielen Dank.

sko1 27. Apr 2017 13:15

AW: Datentypen von String zu Byte und wieder zurück
 
Wozu die zwischenzeitliche Umkonvertierung in Bits und wieder zurück?

Du nimmst doch eigentlich aus den beiden Strings (das sind keine Datensätze!) jeweils die Zeichen!

Dazu stimmt Dein Beispiel nicht!

Mein Beispiel:

1) 12345
2) ABCDE

Ergebnis soll sein

A1B2C3D4E5 richtig?

Nur mal zusammengetippt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,r : string;
i : integer;
begin
a := '12345';
b := 'ABCDE';

r := '';
for i := 1 to 5 do
  r := r + b[i] + a[i];

ShowMessage(r);
end;

Ciao
Stefan

Graw 27. Apr 2017 13:23

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

entschuldige meine falsche Ausdrucksweise :oops:

Die "Sortierung" die du gemacht hast ist für mich nicht ausreichend.

Wenn ich mein Beispiel nehme wird aus:

003F800 + 001FC00 = 000007FFE00000
und nicht:

003F800 + 001FC00 = 000013FFC80000

sko1 27. Apr 2017 13:28

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

1. Datensatz: 0000|0000|0011|1111|1000|0000|0000
2. Datensatz: 0000|0000|0001|1111|1100|0000|0000

Diese beiden Datensätze muss ich dann zu einem zusammenfügen.
Dazu nehme ich das erste Zeichen von Datensatz 2 dann das erste von Datensatz 1 dann das zweite von Datensatz 2 usw.

0|0|0|0|0|7|F|F|E|0|0|0|0|0

Bitte beschreibe den Algorithmus genauer!
Deine beiden Ausgangswerte haben je 2 Nullen vorn, Dein Ergebnis hat vorn 5 Nullen
Dann kommt eine 1 und eine 3, warum wird da im Ergebnis 7?

Ich verstehe immer noch nicht was Du da eigentlich machen willst!

Ciao
Stefan

Uwe Raabe 27. Apr 2017 13:29

AW: Datentypen von String zu Byte und wieder zurück
 
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;

Graw 27. Apr 2017 15:08

AW: Datentypen von String zu Byte und wieder zurück
 
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!!

himitsu 27. Apr 2017 17:42

AW: Datentypen von String zu Byte und wieder zurück
 
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein. :zwinker:


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.

Olli73 27. Apr 2017 19:55

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

Zitat von himitsu (Beitrag 1369333)
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein. :zwinker:

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... ;)

Michael II 27. Apr 2017 21:01

AW: Datentypen von String zu Byte und wieder zurück
 
Ja, immer wieder spannend was man so alles in eine einfache Menge packen kann :-D.

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.

Uwe Raabe 27. Apr 2017 22:02

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

Zitat von himitsu (Beitrag 1369333)
BS hat offiziell nur 4 Bit, aber irgendwer tut da 8 Bits rein .... so ganz Richtig kann das nicht sein. :zwinker:

Gut erkannt!
Delphi-Quellcode:
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.

Zitat:

Zitat von Michael II (Beitrag 1369342)
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
Delphi-Quellcode:
const
deklarieren). Es ging mir hier aber im Wesentlichen darum, den beschriebenen Algorithmus möglichst exakt nachzubilden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Seite 1 von 4  1 23     Letzte »    

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