AGB  ·  Datenschutz  ·  Impressum  







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

xor Verknupfungen

Ein Thema von js747a · begonnen am 7. Apr 2022 · letzter Beitrag vom 13. Apr 2022
Antwort Antwort
js747a

Registriert seit: 11. Aug 2008
Ort: Nord hessen
43 Beiträge
 
Delphi 7 Enterprise
 
#1

xor Verknupfungen

  Alt 7. Apr 2022, 14:18
An alle Delphi User die sich mit xor Verknupfungen auskennen.

zunächst muss ich mal diesen Satz in Delphi umsetzen.

Im LOCONET Protokol steht das
Die Daten-Bytes auf dem LocoNet® sind als 8-Bit-Daten definiert, die mit dem als letztes Bit im Oktett übertragenen höchstwertigen Bit (ms) eine Befehlscode-Markierung (OPCODE) erhalten. Wenn das ms-Bit (D7) 1 ist, werden die 7 geringwertigeren Bits als Netzwerk-OPCODE interpretiert. Dieses OPCODE-Byte ist immner nur einmal in einer gültigen Nachricht enthalten und ist das erste Byte einer Nachricht. In allen überigen Bytes der Nachricht muss inklusive des letzten Prüfsummenbytes (CHECKSUM) das höchstwertige Bit auf 0 gesetzt sein. Die CHECKSUM ist das Einer-COMPLEMENT eines Exclusiv-Oder über alle Bytes der Nachricht, außer der CHECKSUM selbst. Um die Datengenauigkeit zu prüfen, sind alle Bytes einer korrekten Nachricht exclusiv-oder-verknüpft. Wenn der resultierende Wert hexadezimal “FF” ist, werden die Daten als richtig akzeptiert.

mein Versuch

Dieses OPCODE-Byte ist immner nur einmal in einer gültigen Nachricht enthalten und ist das erste Byte einer Nachricht.

OPCODE 0x83 also z.B.

OPCODE ; Byte;
OPCODE := 130; //0x83

Die CHECKSUM ist das Einer-COMPLEMENT eines Exclusiv-Oder über alle Bytes der Nachricht

CheckByte ,Checksum : Byte;
CheckByte := $00;
Checksum := OPC_GPON xor CheckByte;


Senden
InterfacePort.WriteStr(Chr(OPCODE )+Chr(Checksum));
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: xor Verknupfungen

  Alt 8. Apr 2022, 12:51
Mit Chr und String währe ich aber vorsichtig. Die Umwandlung aus deiner Bytefolge etwas ganz anderes machen als erwartet.
Hier währe TBytes als Buffer(für die zu übertragene Bytefolge) und eine Funktion die direkt eine Bytefolge überträgt sinnvoller.
Delphi-Quellcode:
function BuildCommand(ACommand: Byte; AData: const array of Byte): TBytes;
var
  CheckSum, B: Byte;
begin
  SetLength(Result, 2 + Length(AData));
  CheckSum := ACommand;
  Result[0] := ACommand;
  for var n := 0 to High(AData) do
  begin
    B := AData[n];
    CheckSum := CheckSum xor B;
    Result[1 + n] := B;
  end;
  Checksum := CheckSum xor $FF;
  Result[High(Result)] := CheckSum;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: xor Verknupfungen

  Alt 8. Apr 2022, 13:08
Mit Chr und String währe ich aber vorsichtig. Die Umwandlung aus deiner Bytefolge etwas ganz anderes machen als erwartet.
Hier währe TBytes als Buffer(für die zu übertragene Bytefolge) und eine Funktion die direkt eine Bytefolge überträgt sinnvoller.
Wenn es hier wirklich um Delphi 7 geht, ist das vermutlich nur halb so schlimm. Da würde es dann auch kein TBytes geben.

Und sollte dies
function BuildCommand(ACommand: Byte; AData: const array of Byte): TBytes;

nicht eher so aussehen?
function BuildCommand(ACommand: Byte; const AData: array of Byte): TBytes;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
js747a

Registriert seit: 11. Aug 2008
Ort: Nord hessen
43 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: xor Verknupfungen

  Alt 9. Apr 2022, 13:37
Hallo, erstmal Danke für die Antworten.
Aber wie kann ich das ohne die TByte machen.
In Delphi 7



function BuildCommand(ACommand: Byte; AData: const array of Byte): TBytes;
var
CheckSum, B: Byte;
begin
SetLength(Result, 2 + Length(AData));
CheckSum := ACommand;
Result[0] := ACommand;
for var n := 0 to High(AData) do
begin
B := AData[n];
CheckSum := CheckSum xor B;
Result[1 + n] := B;
end;
Checksum := CheckSum xor $FF;
Result[High(Result)] := CheckSum;
end;

Wenn ich das Richtig verstehe dann ..


wenn ich nur 2 Byte sende.

Ein TByte ist also ein Array of Bytes.
- CheckSum := ACommand; ist OPCODE 0x83
- Result[0] := ACommand; ist das erste im Array also bei mit OPCODE 0x83
- Checksum := CheckSum xor $FF;
- Result[1] := Checksum ;
InterfacePort.WriteStr(Chr(Result[0])+Chr(Result[1]));


wenn ich mehr als 2 Byte sende.

- CheckSum := ACommand; ist OPCODE 0x83
- Result[0] := ACommand; ist das erste im Array also bei mit OPCODE 0x83

dann wird für jedes Byte in AData
- B = n Byte in AData
- CheckSum := CheckSum xor B;
- Result[n] = B

- Checksum := CheckSum xor $FF;
- Result[High(Result)] := CheckSum; - Letzte Byte in Result := CheckSum
InterfacePort.WriteStr(Chr(Result[0])+Chr(Result[n])+Chr(Result[n]));
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: xor Verknupfungen

  Alt 9. Apr 2022, 21:05
Aber wie kann ich das ohne die TByte machen
Gar nicht. Aber definiere es einfach selbst und fertig ist.
Delphi-Quellcode:
type
  TBytes = array of Byte;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Kurt Wallander

Registriert seit: 11. Mai 2020
Ort: Freiberg
35 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: xor Verknupfungen

  Alt 13. Apr 2022, 12:04
Hi
ich habe zu deinem Problem ein paar Fragen. Wieviel Byte umfaßt ein Datentransfer?
die dezimale Darstellung von 0x83 ist 131 anstatt 130.
Ein Checkbyte mit 0x00 zu belegen und ein anderes Byte (OP...) mit xor Checkbyte zu verknüpfen macht keinen Sinn: es kommt als Ergebnis wieder OP... heraus.
Du mußt also Byte1 xor Byte2 xor Byte3 ... bilden.
Falls das höherwertige bit des Bytex den wert 1 hat (Bytex>=128 oder Bytex>=0x80) sollen nur die niederwertigen Bytes berücksichtigt werden: Bytex and 0x7F bzw Bytex and 127.
Die Checksumme ist zum Schluß bitweise zu negieren: CheckSum:= not (Ergebnis aller xor-Verknüpfungen)
Good luck
  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 20:31 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