[gelöst] UInt32 aus Filestream lesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: UInt32 aus Filestream lesen

Beitrag von theo »

kirchfritz hat geschrieben: Do 11. Jul 2024, 11:49 Ich wollte eigentlich nur die Bedeutung von

Code: Alles auswählen

const byte ByteMask = 0b11111111;
UINt32 a = (value >> 24) & ByteMask;
UINt32 b = (value >> 16) & ByteMask;
UINt32 c = (value >> 8) & ByteMask;
UINt32 d = (value >> 0) & ByteMask;
value = a << 0 | b << 8 | c << 16 | d <<24
verstehen, und wie man das in PASCAL - Syntax übersetzt.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const
  ByteMask = %11111111;
var
  Value, a, b, c, d:  Cardinal;
begin
  Value := $FF00;
  Memo1.Lines.add(Value.ToHexString);
  
  //1:1 in Pascal Syntax übersetzt:
  a := (Value shr 24) and ByteMask;
  b := (Value shr 16) and ByteMask;
  c := (Value shr 8) and ByteMask;
  d := (Value shr 0) and ByteMask;
  Value := a shl 0 or b shl 8 or c shl 16 or d shl 24;
  
  Memo1.Lines.add(Value.ToHexString());

//Oder einfach:
  Value := $FF00;
  Memo1.Lines.add(Value.ToHexString);
  Value:=SwapEndian(Value);
  Memo1.Lines.add(Value.ToHexString);
end;   

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: UInt32 aus Filestream lesen

Beitrag von six1 »

das kannst du mit einem SHR 24/16/8 machen

Da wird zuerst das höchstwertige Byte ganz nach rechts geschoben und mit FF maskiert. Das ergibt EIN Byte. Nehmen wir mal an, das QUAD Byte besteht aus folgendem:
AABBCCDD

AA ist das höchstwertige und DD das niederwertigste Byte

Dann wird AA 24Bit nach rechts geschoben und ist somit an der Position von "DD". Das wird mit FF maskiert (ver-und-et) und somit kommt "AA" raus
Das ganze wird dann mit 16Bit nach rechts und 8 Bit nach rechts wiederholt. Zum Schluss wird der Wert einfach mit FF maskiert ohne Verschiebung und man hat das "DD" Byte

Reicht das für Dein Verständnis?


Edit: Theo war schneller ;-)
Zuletzt geändert von six1 am Do 11. Jul 2024, 14:35, insgesamt 2-mal geändert.
Gruß, Michael

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: UInt32 aus Filestream lesen

Beitrag von Zvoni »

kirchfritz hat geschrieben: Do 11. Jul 2024, 11:49 Ich wollte eigentlich nur die Bedeutung von

Code: Alles auswählen

const byte ByteMask = 0b11111111;
UINt32 a = (value >> 24) & ByteMask;
UINt32 b = (value >> 16) & ByteMask;
UINt32 c = (value >> 8) & ByteMask;
UINt32 d = (value >> 0) & ByteMask;
value = a << 0 | b << 8 | c << 16 | d <<24
verstehen, und wie man das in PASCAL - Syntax übersetzt.
ersetze ">>" mit "shr", "<<" mit "shl", "&" mit "And", "|" mit "Or" und du bist zu 95% da
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

kirchfritz
Beiträge: 227
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[gelöst]UInt32 aus Filestream lesen

Beitrag von kirchfritz »

Vielen Dank!
Alle Fragen geklärt.

PascalDragon
Beiträge: 963
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: UInt32 aus Filestream lesen

Beitrag von PascalDragon »

theo hat geschrieben: Mi 10. Jul 2024, 12:47 Ist das im original C?
Am Ende ist ja BSWAP ein x86 ASM Befehl.
Warum wird der im obigen Code nicht genutzt?
Selbst wenn es C und nicht C# wäre: warum sollte ein CPU-spezifischer Befehl genutzt werden, wenn man es auch unabhängig davon machen kann? (Auch wenn man natürlich eine passende Funktion dafür nutzen sollte (wie in FPC SwapEndian), da der Compiler (oder die RTL) das dann normalerweise mit eben solchen Assemblerbefehlen passend für die Ziel-CPU optimiert)
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: UInt32 aus Filestream lesen

Beitrag von theo »

PascalDragon hat geschrieben: So 14. Jul 2024, 22:21
theo hat geschrieben: Mi 10. Jul 2024, 12:47 Ist das im original C?
Am Ende ist ja BSWAP ein x86 ASM Befehl.
Warum wird der im obigen Code nicht genutzt?
Selbst wenn es C und nicht C# wäre: warum sollte ein CPU-spezifischer Befehl genutzt werden, wenn man es auch unabhängig davon machen kann? (Auch wenn man natürlich eine passende Funktion dafür nutzen sollte (wie in FPC SwapEndian), da der Compiler (oder die RTL) das dann normalerweise mit eben solchen Assemblerbefehlen passend für die Ziel-CPU optimiert)
So war das auch gemeint.
Ich wunderte mich nur, dass man eine Funktion mühsam "von Hand" schreibt, die so essenziell ist, dass sie sogar als ASM Befehl vorliegt.
Natürlich sollte man konkret den entsprechenden hochsprachlichen Befehl verwenden.

Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] UInt32 aus Filestream lesen

Beitrag von Mathias »

Ich wunderte mich nur, dass man eine Funktion mühsam "von Hand" schreibt, die so essenziell ist, dass sie sogar als ASM Befehl vorliegt.
Ist C# nicht ein Interpreter, dem nicht bekannt ist, was für eine CPU man hat ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 963
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [gelöst] UInt32 aus Filestream lesen

Beitrag von PascalDragon »

Mathias hat geschrieben: Mo 15. Jul 2024, 17:15
Ich wunderte mich nur, dass man eine Funktion mühsam "von Hand" schreibt, die so essenziell ist, dass sie sogar als ASM Befehl vorliegt.
Ist C# nicht ein Interpreter, dem nicht bekannt ist, was für eine CPU man hat ?
Erstens ist C# kein Interpreter. C# Code wird in sogenannte Intermediate Language (aka "Zwischensprache") kompiliert, welche dann in der PE-Datei abgelegt wird. Die .NET-Laufzeitumgebung (CLR für Common Language Runtime), mit der du die Anwendung dann ausführst, kompiliert diese Intermediate Language in den eigentlichen Maschinencode. Hier kann die CLR natürlich irgendeinen allgemeinen Befehl zum Ändern der Endianess nutzen. Oder es kann eine Bibliotheksfunktion bereitgestellt sein, welche dann plattformspezifisch implementiert ist.

Und zweitens, selbst wenn es interpretiert wäre, die beiden letzten Punkte können auch für interpretierten Code gelten.
FPC Compiler Entwickler

Antworten