Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi CardinalToBytes + BytesToCardinal (https://www.delphipraxis.net/148786-cardinaltobytes-bytestocardinal.html)

jokerfacehro 8. Mär 2010 13:15


CardinalToBytes + BytesToCardinal
 
mit folgenden Funktionen kann man eine natürliche Zahl in Bytes umwandeln
z.B. zum versenden über einen socket.


Delphi-Quellcode:

uses Math;

function CardinalToBytes(Num:integer):string;
var i,k,j:integer;
    buffer:string;
begin

j:=ceil(log(num)/log(256));
k:=Power(2,j-1);

for i:=1 to j do begin
  j:=Num DIV k;
  buffer:=buffer+chr(j);
  Num:=Num-j*k;
  k:=k DIV 256;
end;

Result:=buffer;

end;



Delphi-Quellcode:
function BytesToCardinal(Code:string):integer;
var i,k,num:integer;
begin

k:=1;
num:=0;

for i:=Length(Code) downto 1 do begin
  num:=num+ord(Code[i])*k;
  k:=k*256;
  end;

Result:=num;

end;

SirThornberry 8. Mär 2010 13:18

Re: CardinalToBytes + BytesToCardinal
 
ich würde einfach einen variant-Record nehmen oder die bits shiften.

jfheins 8. Mär 2010 13:19

Re: CardinalToBytes + BytesToCardinal
 
Das kann man doch auch einfacher erreichen.
z.B. über einen varianten record oder eine Variablendeklaration mit dem absolute Schlüsselwort (Wenn man ein Byte-Array möchte)
oder einfach einmal setlength & copy aufrufen (Wenn man nen String möchte)

jokerfacehro 8. Mär 2010 13:21

Re: CardinalToBytes + BytesToCardinal
 
ok zeigt ma bitte :D

himitsu 8. Mär 2010 13:23

Re: CardinalToBytes + BytesToCardinal
 
meine Delphis kennen kein Delphi-Referenz durchsuchenLog und wie gesagt, es ist eh einfacher lösbar.

jokerfacehro 8. Mär 2010 13:27

Re: CardinalToBytes + BytesToCardinal
 
ich ha bschon gescuht aber nix gefunden

habt ihr nen link zum thema ?

jfheins 8. Mär 2010 13:29

Re: CardinalToBytes + BytesToCardinal
 
Zitat:

Zitat von jokerfacehro
ok zeigt ma bitte :D

Delphi-Quellcode:
function CardinalToBytes(const Num: integer):string;
begin
  setlength(Result, sizeof(integer));
  CopyMemory(@Result[1], @num, sizeof(integer));
end;
Das wäre jetzt meine erste Idee, wenn ich so eine Funktion schreiben müsste ;)

Btw.: Funktionsname und Argument widersprechen sich ;)

p80286 8. Mär 2010 13:35

Re: CardinalToBytes + BytesToCardinal
 
Zitat:

Zitat von jfheins

Btw.: Funktionsname und Argument widersprechen sich ;)

Funktionsname und Resulttyp auch (für mich ist Byte immer noch numerisch )

Gruß
K-H

himitsu 8. Mär 2010 13:40

Re: CardinalToBytes + BytesToCardinal
 
@jfheins: vergiß Delphi 2009/2010 nicht :zwinker:
Delphi-Quellcode:
function IntegerToChars(const Num: Integer): AnsiString;
begin
  SetLength(Result, SizeOf(Integer));
  CopyMemory(@Result[1], @Num, SizeOf(Integer));
end;
oder wenn es unbedingt eine Schleife sein muß
Delphi-Quellcode:
function IntegerToChars(Num: Integer): String{oder AnsiString};
var
  i: Integer;
begin
  Result := '';
  for i := 1 to SizeOf(Integer) do begin
    Result := Result + AnsiChar(Num);
    Num := Num shr 8;
  end;
end;
und nach winziger Speicheroptimierung
Delphi-Quellcode:
function IntegerToChars(Num: Integer): String{oder AnsiString};
var
  i: Integer;
begin
  SetLength(Result, SizeOf(Integer));
  for i := 1 to SizeOf(Integer) do begin
    Result[i] := AnsiChar(Num);
    Num := Num shr 8;
  end;
end;

gammatester 8. Mär 2010 14:07

Re: CardinalToBytes + BytesToCardinal
 
Was soll eigentlich der Sinn dieser ganzen Aktion sein? #0-Chars werden nicht vermieden, also kann man doch gleich einen
Delphi-Quellcode:
type tcharint = packed array[0..sizeof(integer)-1] of ansichar;
und einen Type cast tcharint(myinteger) nehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 1 von 2  1 2      

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