Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hex to String (https://www.delphipraxis.net/111813-hex-string.html)

XXcD 9. Apr 2008 22:48

Re: Hex to String
 
Hmm ich würde mal sagen garnichts.

Ich habe einen Hexwert der so aussieht: 01001770010004
Den muss ich in ein String umwandeln und zu einen Server schicken.
Wenn ich jetzt die gegenprobe mache und das wieder in einen Hexwert umwandel passiert folgendes: 0117700104
Die 00 sind einfach weg.

Muetze1 9. Apr 2008 22:52

Re: Hex to String
 
Das sind eindeutig Binärdaten und hexadezimal ist nur eine Darstellungsform. Somit glaube ich hier eher, dass du gar nicht richtig weisst, was du hier machst. Du willst Binärdaten dem Server schicken und somit ist der String nicht die geeignete Ablageform. Somit bekommst du diese Probleme.

XXcD 9. Apr 2008 23:01

Re: Hex to String
 
ohhh ihr wisst nicht was ich meine es sind keine Binärdaten, es sind einfach nur Befehle an den Server die nicht als Text sein sollen sondern als Befehle.
Und in Binärdaten gibt es nur 1 oder 0 und keine 7.
Ich kann auch nen anderen Hexwert zeigen, damit ihr überzeugt seit.

2061706F6C6F67697A6520666F7220616E7920696E636F6E76 656E69656E6365206361757365642E0D0A0D0A3C623E3

Hier könnt ihr euch übersetzen, dann seht ihr, dass es doch ein Hexwert ist.

Vielleicht hilft ja noch die Funktion mir der ich die Daten die ich empfange von strings in Hex werte umwandel:

Delphi-Quellcode:
function StrToHex(const S: String): String;
const
  HexDigits: array[0..15] of Char = '0123456789ABCDEF';
var
  I: Integer;
  P1: PChar;
  P2: PChar;
  B: Byte;
begin

  SetLength(Result, Length(S) * 2);
  P1 := @S[1];
  P2 := @Result[1];

  for I := 1 to Length(S) do
  begin
    B := Byte(P1^);
    P2^ := HexDigits[B shr 4];
    Inc(P2);
    P2^ := HexDigits[B and $F];
    Inc(P1);
    Inc(P2);
  end;

end;

Muetze1 9. Apr 2008 23:38

Re: Hex to String
 
Zitat:

Zitat von XXcD
Und in Binärdaten gibt es nur 1 oder 0 und keine 7.

Wer hat dir denn das geflüstert? Ein Binärwert hat nur 0 und 1 - und ist wiederrum (mal) wieder nur eine Darstellungsform. Die Daten selber sind in unterschiedlich grossen Datentypen organisiert. Als kleinste Einheit gibt es das Byte (es gibt logisch kleinere Einheiten, z.B. ein Nibble) und dies kann 2^8 (256) unterschiedliche Werte annehmen (0..255). Das nicht alle diese Werte im ASCII einfach nur dargestellt werden können, liegt daran, dass die Zeichen im unteren Bereich Steuerzeichen sind und diese bestimmte Funktionen erfüllen.

So, wenn wir nun von Binärdaten sprechen, dann hier mal ein Beispiel:

Du nimmst einen Integer mit einem Wert von 3. Diesen kannst du nun sehr schön ausgeben:

binär: 00000000 00000000 00000000 00000011
oktal: 000003
dezimal: 4
hexadezimal: 00 00 00 03
etc, etc, etc

Und wenn du ihn als String darstellst bzw. als Zeichen bekommst du #0#0#0#3 und das sind Steuerzeichen.

Wenn du nun das ganze nicht als Integer sondern als eine Zusammenfassung von 4 Bytes mit einer gewissen Priorisierung bzw. Anordung, dann hast du den Binärwert des Integers. Binärwerte haben einen gewissen Umfang von Bytes und geben keine Interpretation der Daten wieder sondern nur die Daten. Die Darstellungsformen wiederrum benötigen einen interpretierten Datenwert - hier interpretiert als Integer. Dieser definiert sich dadurch, dass er 4 Bytes benötigt, das oberste Byte kommt zuerst im Speicher, das unterste zuletzt. Das oberste Bit (31. Bit) gibt das Vorzeichen an. Mit diesen Informationen kann man die Binärdaten bewerten und dementsprechend verarbeiten.

Deine Ketten sind definitiv Binärdaten und haben spezielle Bedeutungen. Diese Bedeutungen solltest du entsprechend nutzen und interpretieren. Wenn der Server z.B: ein Datenpacket wie dieses braucht: (hex) 00 03 00 04 22 0A, dann sieht das zwar in Hex recht schön aus, sagt aber nichts über die Bedeutung/Bewertung der einzelnen Bits und Bytes aus.

Die selben Daten als Struktur:
1. Byte: Type (0 = Antwort, 1 = Anfrage, 2 = Status, etc)
2. Byte: Message Identification (01 = Server Version, 02 = Server Status, 03 = etc)
...
usw.

Somit kannst du diese Struktur in einem Record definieren und entsprechend interpretieren, aufbauen, auslesen. Diesen Record im Speicher wird genauso abgelegt wie die hexadezimale Darstellung es darlegt. Der Typ der Daten wird mit der Struktur definiert und somit kann man sie interpretieren.

Du hingegen hast bisher nur Bytes aneinander gereiht. Auch die Strings die du nachher sendest haben eine entsprechende Bedeutung. Es kommt mir eher so vor, als wenn du diese ganzen Daten einfach mit einem Sniffer mitgelesen hast und ohne zu wissen was sie im einzelnen bedeuten kommunizierst du mit dem Server.

Ob da nun kriminelle Energie zu Grunde liegt oder was auch immer, ist eine Interpretationsfrage. Grundlegend aber, fehlt hier offensichtlich Wissen deinerseits. Schon allein die Aussage
XXcD
ohhh ihr wisst nicht was ich meine es sind keine Binärdaten, es sind einfach nur Befehle an den Server die nicht als Text sein sollen sondern als Befehle.
bestätigt meine Annahme. Also entweder mehr Informationen und wissen was man tut, oder du kannst dies nicht entsprechend liefern (andere Vermutung).

Zitat:

Zitat von XXcD
Vielleicht hilft ja noch die Funktion mir der ich die Daten die ich empfange von strings in Hex werte umwandel:

Du übergibst einen String - bzw. du empfängst Daten und legst diese in einem String ab. Das bedeutet doch nicht, dass es ein String ist. Du legst Binärdaten in einem String ab - der ist nicht dazu gedacht. Und schon ist es definitiv ein String?

Ich kann auch meine EXE in einem String ablegen, aber es definitiv der falsche Kontainertyp dafür. Aber egal, du weisst es ja besser.

Und zu deiner Funktion: es gibt vorgefertigte Funktionen für beide Richtungen. Beide wurden aber schon gepostet in diesem Thread: Delphi-Referenz durchsuchenHexToBin() und Delphi-Referenz durchsuchenBinToHex()

Klaus01 10. Apr 2008 07:23

Re: Hex to String
 
Guten Morgen,

mach Dir doch ein Array of Char
und wandel mit
Delphi-Quellcode:
chr(StrToInt('$00'))
die HexWerte die in Stringform vorliegen
wieder in den ByteCode (hier char) um.
Das Array kannst Du dann zum Server übertragen.

Grüße
Klaus

XXcD 10. Apr 2008 10:02

Re: Hex to String
 
Ok das funktioniert genauso wie meine alte funktion.

Ich habe jetzt folgendes gemacht:

Delphi-Quellcode:
function HexStringToStr(d : string):string;
var
  I, s: Integer;
  n: string;
begin
s:=1;
for I := 1 to length(d) div 2 do
begin
n:= copy(d, s, 2);
Form6.packetinjecttemp.Text:=Form6.packetinjecttemp.Text+chr(StrToInt('$'+d));
s:= I * 2 + 1;
end;
end;
In Basic funktioniert die Function, da habe ich mir das ein wenig abgeschaut:

Code:
Public Function HexToString(sMessage As String) As String
Dim i As Integer
    For i = 1 To Len(sMessage) Step 2
        HexToString = HexToString & Chr(Int("&h" & Mid(sMessage, i, 2)))
    Next
End Function
Vielleicht weiß ja einer was da nicht stimmt.

Klaus01 10. Apr 2008 10:22

Re: Hex to String
 
..aber auch in dem Basic Beispiel sind
Zeichen mit einem AsciiWert von #0 nicht darstellbar.

Grüße
Klaus

XXcD 10. Apr 2008 10:23

Re: Hex to String
 
Hmmmmmm komisch da funktioniert das ganze ohne Probleme.
Was mache ich denn da falsch??

Klaus01 10. Apr 2008 10:39

Re: Hex to String
 
Vielleicht machst Du ja nichts falsch.
Im Basic Beispiel werden die Daten auch nicht angezeigt.
Du packst sie in ein Editfeld oder Memo oder sonstwas.

Die Zeichen sind alle im String enthalten, sie können aber nicht
angezeigt werden.
Setzte Dir mal einen Haltepunkt und schau Dir mal den String mit Strg-F5 an.

Grüße
Klaus

XXcD 10. Apr 2008 11:31

Re: Hex to String
 
Hat sich erledigt, funktioniert alles gut.

Vielen Dank :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Seite 2 von 4     12 34      

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