Delphi-PRAXiS

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.

alzaimar 10. Apr 2010 20:34

Re: CardinalToBytes + BytesToCardinal
 
Ich verstehe den Sinn auch nicht, aber wieso sollte man #0-Zeichen vermeiden?

Neutral General 11. Apr 2010 02:08

Re: CardinalToBytes + BytesToCardinal
 
Mal davon abgesehn, dass es einem Socket relativ egal ist ob man ein Integer oder ein String versendet. Daten sind Daten. Von daher ist diese Umwandlung eigentlich ziemlich schwachsinnig.


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