Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Single in Byte-Array konvertieren und umgekehrt (https://www.delphipraxis.net/122021-single-byte-array-konvertieren-und-umgekehrt.html)

idontwantaname 8. Okt 2008 10:55


Single in Byte-Array konvertieren und umgekehrt
 
Hi!

Wie kann ich denn eine Variable vom Typ Single in ein Byte-Array konvertieren und auch wieder zurück?

Lg oli

Apollonius 8. Okt 2008 10:59

Re: Single in Byte-Array konvertieren und umgekehrt
 
Ein Single ist vier Byte lang. Also kannst du so vorgehen:
Delphi-Quellcode:
var s: Single; b: array[0..3] of Byte;
begin
  //hin
  b[0] := PCardinal(@s)^ and $FF;
  b[1] := (PCardinal(@s)^ shr 8) and $FF;
  b[2] := (PCardinal(@s)^ shr 16) and $FF;
  b[3] := (PCardinal(@s)^ shr 24) and $FF;
  //zurück
  s := PSingle(@b[0])^;
end;

idontwantaname 8. Okt 2008 11:01

Re: Single in Byte-Array konvertieren und umgekehrt
 
Ah, ich muss das über einen anderen 4-Byte langen Datentyp machen, der Rest war mir eh klar ;)
Vielen Dank!

Roachford 8. Okt 2008 11:05

Re: Single in Byte-Array konvertieren und umgekehrt
 
Delphi-Quellcode:
type
  TSingleArray = array[0..sizeof(single)-1] of byte;
  TSingleByteAlias = case byte of
    0: (org: single);
    1: (arr: TSingleArray);
  end;
Delphi-Quellcode:
procedure ConvertSingleToByteArray(const ASingle: single; out AArray: TSingleArray);
var
  lConvertHelper: TSingleByteAlias;
begin
  lConvertHelper.org := ASingle;
  AArray := lConvertHelper.arr;
end;

procedure ConvertByteArrayToSingle(const AArray: TSingleArray; out ASingle: single);
var
  lConvertHelper: TSingleByteAlias;
begin
  lConvertHelper.arr := AArray;
  ASingle := lConvertHelper.org;
end;
Nur getippt, nicht getestet...

Medium 8. Okt 2008 14:46

Re: Single in Byte-Array konvertieren und umgekehrt
 
Nicht ganz. Es ist ja ein record, und das sollte man schon dazu schreiben ;)
Noch ein "packed" dazu um Problemen mit Alignment von vorne herein aus dem Wege zu gehen, und die Deklaration des Arrays geht kürzer (ist aber technisch identisch):
Delphi-Quellcode:
type
  TSingleArray = packed array[sizeof(single)] of byte;
  TSingleByteAlias = record
  case boolean of
    true: (org: single);
    false: (arr: TSingleArray);
  end;

Roachford 8. Okt 2008 14:55

Re: Single in Byte-Array konvertieren und umgekehrt
 
Zitat:

Zitat von Medium
Nicht ganz. Es ist ja ein record, und das sollte man schon dazu schreiben ;)

Stimmt, vergessen.
Zitat:

Zitat von Medium
Noch ein "packed" dazu um Problemen mit Alignment von vorne herein aus dem Wege zu gehen, und die Deklaration des Arrays geht kürzer (ist aber technisch identisch):

... und tritt niemals ein. Von daher ist das packed vollkommen vernachlässigbar. Ausser natürlich, man will mit der Grösse seiner Quellcodedateien angeben, dann kann man auch mehr Kommentare einfügen.

Hawkeye219 8. Okt 2008 15:19

Re: Single in Byte-Array konvertieren und umgekehrt
 
Hallo,

weitere Möglichkeiten wären ein direkter Typecast mit dem Zieldatentyp oder die Deklaration mittels absolute:

Delphi-Quellcode:
var
  A : array [0..3] of Byte = (0, 0, 40, 66);
  s : Single absolute A;
begin
  // Möglichkeit #1
  ShowMessage (FloatToStr(Single(a)));
 
  // Möglichkeit #2
  ShowMessage (FloatToStr(s));
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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