AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delphi

Ein Thema von Moien · begonnen am 24. Feb 2020 · letzter Beitrag vom 25. Feb 2020
Antwort Antwort
Moien

Registriert seit: 20. Feb 2020
6 Beiträge
 
#1

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 24. Feb 2020, 10:25
Vielen Dank für alle Antworten.
Ehrlich gesagt, ich habe nicht genau verstanden was ihr mit " eine Analyse der Bytefolgen" meint. Habt ihr ein Beispiel?

LG;
Moien
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 24. Feb 2020, 10:37
ich habe nicht genau verstanden was ihr mit " eine Analyse der Bytefolgen" meint. Habt ihr ein Beispiel?
In deinem Beispiel ist ReadVar_vonSPS doch ein Byte-Array. Dein OPCServerItemArray scheint ein Array von irgendwas zu sein, und du willst von deinem Byte-Array (oder "Bytefolge") aus die Daten in deinem OPCServerItemArray setzen. Mehr war nicht gemeint 😉
  Mit Zitat antworten Zitat
Moien

Registriert seit: 20. Feb 2020
6 Beiträge
 
#3

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 25. Feb 2020, 10:48
Nochmal vielen Dank für eure Unterstützung
Ich habe schon ein Extra Unit definiert (UnitTypecasting). Und dann sortiere ich die Werte entwieder mit procedure Typecasting oder procedure P2 . Ich erhalte von beiden die gleichen Werte. Aber irgendwie sind die Werte nicht die gleichen, wie sie in der SPS definiert sind. Ich glaube, es gibt einige Probleme mit der Byte-Ordnung (Big-Endian und Little-Endian). Habt ihr eine Idee, wie man die Byte-Reihenfolge ändern kann?

Delphi-Quellcode:
unit UnitTypecasting;

interface

uses
   System.SysUtils,
   System.Types;

type
   TAppData = packed record

        //[variable_0]
        S1_PIn_00_bar : Single;

        //[variable_1]
        S1_PIn_DateTime_00_time : UInt32;

        //[variable_2]
        S1_PIn_01_bar : Single;

        //[variable_3]
        S1_PIn_DateTime_01_time : UInt32;

        //[variable_4]
        S1_PIn_02_bar : Single;

        //[variable_5]
        S1_PIn_DateTime_02_time : UInt32;

        //[variable_6]
        S1_PIn_03_bar : Single;
        .
        .
        .

        //[variable_227]
        RDT_P1_Enabled : Boolean;

        //[variable_228]
        RDT_P2_Enabled : Boolean;

        //[variable_229]
        RDT_P3_Enabled : Boolean;


   end;
   PAppData = ^TAppData;

   procedure Typecasting(var data : TBytes);
   procedure p2(var data2 : TBytes);

implementation

procedure Typecasting(var data : TBytes);
var
   appData: TAppData;
begin
   appData := TBitConverter.InTo<TAppData>(data);
end;

procedure p2(var data2 : TBytes);
var
   appData2: TAppData;
begin
   appData2 := (PAppData(@data2[0]))^;
end;

end.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.191 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 25. Feb 2020, 12:36
Wenn du dir sicher bist dass es ein Big/Little-Endian Problem ist:

Ich habe in der Delphi-Standard-Bibliothek komischerweise nie etwas gefunden wie man die Endianess von Dingen wie z.B. einem Word ändern kann. Ich habe es dann ganz billig von Hand gemacht. Hier ein Beispiel:

https://gist.github.com/JensMertelme...1297748f61c91b

Geändert von Der schöne Günther (25. Feb 2020 um 12:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 25. Feb 2020, 15:02
Swap

und in der System-Unit versteckt sich auch etwas (intern), wenn ich mich nicht irre. (wegen MacOS, was andersrum ist/war/oderso)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.667 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Typecasting eines Arrays von Byte und Schreiben in verschiedene Variablen in Delp

  Alt 25. Feb 2020, 15:19
Habt ihr eine Idee, wie man die Byte-Reihenfolge ändern kann?
Delphi-Quellcode:
///<summary>
/// returns a 16 bit in reversed byte order, e.g. $1234 => $3412)
/// aka converts intel (little endian) to motorola (big endian) byte order format
/// (This is just an alias for system.swap for consistency with Swap32.)
///</summary
function Swap16(_Value: Word): Word;

///<summary>
/// returns a 32 bit value in reversed byte order e.g. $12345678 -> $78563412
/// aka converts intel (little endian) to motorola (big endian) byte order format </summary>
function Swap32(_Value: LongWord): LongWord;
function Swap32pas(_Value: LongWord): LongWord;


function Swap16(_Value: Word): Word;
{$IFDEF SUPPORTS_INLINE}
inline;
{$ENDIF}
begin
  Result := swap(_Value);
end;
// alternative implementation based on https://stackoverflow.com/a/3065619/49925
//function Swap16(Value: smallint): smallint; register;
//asm
// rol ax, 8
//end;

function Swap32(_Value: LongWord): LongWord;
asm
  bswap eax
end;

function Swap32pas(_Value: LongWord): LongWord;
begin
  Result := ((_Value shr 24) and $FF) + (((_Value shr 16) and $FF) shl 8) + (((_Value shr 8) and $FF) shl 16) + ((_Value and $FF) shl 24);
end;
(aus meiner dzlib)

Die Konvertierung ist symmetrisch, d.h. auch wenn die Beschreibung sagt Little Endian -> Big Endian, kann man sie auch für Big Endia -> Little Endian verwenden.

Swap32pas ist lediglich eine Pascal-Implementation von Swap32, also ohne Assembler-Code. Das Ergebnis ist identisch.
Thomas Mueller

Geändert von dummzeuch (25. Feb 2020 um 15:22 Uhr)
  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 16:15 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 by Thomas Breitkreuz