Autor Beitrag
Horscht
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.06.05 21:23 
Hallo zusammen, ich habe ein Array of Byte in dem Zahlen gespeichert sind. Z.B. ist die Zahl 256 zur Basis 10 in dem Array auf folgende Weise abgespeichert: 01 im ersten Byte und 00 im zweiten Byte. Das macht 01 00 und ist gleich 256. Nun möchte ich dieses Array wieder in einen Dezimalstring (256) zurückumwandeln. Wie funktioniert das? Das Problem bei der ganzen Geschichte ist, dass das Array unendlich lang ist z.B.
01 AE 5C 5D 4B 32 19


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am Fr 03.06.2005 um 07:44
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 02.06.05 21:27 
:arrow: BinToHex
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 02.06.05 21:30 
Dank Typecasting geht das ohne besonderen Aufwand, da die beiden aufeinanderfolgenden Bytes nur eine andere Sichtweise eines 16-Bit Wortes sind (sofern Intels perverse Sicht der Dinge uns hier nicht einen Strich durch die Rechung macht). Es ginge so.
Sei A dein 'Array [0..infinity] Of Byte'.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type
  TWordArray = Array [0..maxint] of Word;
  
Begin
  FirstWord := TWordArray (A)[0];
  TenthWord := TWordArray (A)[10];
  ...
End;

Es gibt ca. 3-19 weitere Möglichkeiten (variant records, absolute Adressierung, Pointerverbiegung usw.)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 02.06.05 21:56 
Achso, sorry, hatte wohl die Aufgabenstellung falsch gelesen.
Horscht Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.06.05 22:11 
Vielen Dank schon mal für die schnellen Antworten. Die Lösungen helfen mir jedoch nicht wirklich weiter. Der Datentyp Word ist doch schließlich auch begrenzt. Ich habe in meiner Aufgabe mit superlangen Zahlen zutun. Sie können über die Integer und auch Int64 Grenze hinausgehen. Gehen wir z.B. mal von der DezimalZahl 999999999999999999 (18* die 9) aus. Sie ist in meinem Bytearray und sieht dort wie folgt aus: 0D E0 B6 B3 A7 63 FF FF oder in Dezimalzahlen ausgedrückt: 13 224 182 179 167 99 255 255. Ich möchte nun, dass diese Zahl, das Bytearray, in den String (Dezimalzahl) 999999999999999999 zurückkonvertiert wird. Casting ist bei der Länge dieser Zahlen nicht wirklich angebracht
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Do 02.06.05 23:09 
user profile iconHorscht hat folgendes geschrieben:
Gehen wir z.B. mal von der DezimalZahl 999999999999999999 (18* die 9) aus. Sie ist in meinem Bytearray und sieht dort wie folgt aus: 0D E0 B6 B3 A7 63 FF FF oder in Dezimalzahlen ausgedrückt: 13 224 182 179 167 99 255 255. Ich möchte nun, dass diese Zahl, das Bytearray, in den String (Dezimalzahl) 999999999999999999 zurückkonvertiert wird. Casting ist bei der Länge dieser Zahlen nicht wirklich angebracht

ausblenden Delphi-Quelltext
1:
2:
uses
  Types;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function BytesToDecimalStr(const AByteArry: TByteDynArray): String;
var
  I: Integer;
begin

  Result := '';
  for I := Low(AByteArry) to High(AByteArry) do
    Result := Result + IntToStr(AByteArry[I]);

end;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyByteArry: TByteDynArray;
begin

  SetLength(MyByteArry, 8);

  MyByteArry[0] := $0D;
  MyByteArry[1] := $E0;
  MyByteArry[2] := $B6;
  MyByteArry[3] := $B3;
  MyByteArry[4] := $A7;
  MyByteArry[5] := $63;
  MyByteArry[6] := $FF;
  MyByteArry[7] := $FF;

  ShowMessage(BytesToDecimalStr(MyByteArry));

  SetLength(MyByteArry, 0);

end;

_________________
Ciao, Sprint.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 03.06.05 08:08 
Nett, aber da kommt doch gar nicht 99999999999999999999 raus?

Ich denke mal, du brauchst: www.8ung.at/tbignum/
Horscht Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 03.06.05 11:07 
Nochmals Danke, aber wenn da nicht die richtige Zahl rauskommt, dann ist mir bisher noch nicht geholfen. Auch der Hinweis auf die Seite 8ung bringt mich nicht weiter, weil ich eben eine Funktion brauche, die mein Bytearray in einen Decimalstring umwandelt.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 04.06.05 19:54 
Wenn Du programmieren kannst, dann hilft dir TBigNum weiter, weil im Du im Prinzip ja nur folgendes machen musst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Var
  R : VeryVeryLargeNumber;

Begin
  R:=0;
  Foreach B:Byte in ByteArray do
    R := R*256 + B;
End;


Natürlich gibt es den Datentyp "Verdammt (aber ehrlich) grosse Zahl" in Delphi nicht. Aber dafür gibt es z.B. TBigNum.

Was mich hier an einigen Postern stört, ist die Einstellung, das das Delphi-Forum ein Orakel ist, das einem die Hausaufgaben, Projkektarbeiten etc. komplett abgenommen werden sollen. Wenn Du keine Ahnung vom Coden hast, dann sag es und gut ist. Wenn Du aber nur zu faul bist, dann lerne, deine Probleme selbst zu lösen. Nur "öh, das hilft mir nicht weiter" ist IMHO destruktive Kritik und kontraproduktiv.

Korrigiere mich, wenn ich daneben liege.