Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dezimal -> Binär (https://www.delphipraxis.net/170399-dezimal-binaer.html)

Elexarie 15. Sep 2012 11:20

Dezimal -> Binär
 
Hallo Community,

folgender Quellcode gibt bei mir irgendwie Unsinn aus:

Code:
function CharToBin(ordinary: integer): string;
var ergebnis : integer;
begin

  while ordinary > 0 do

  begin
    ergebnis := ordinary mod 2;
    if ergebnis = 1 then
      result := '1' + result
    else
      result := '0' + result;
    ordinary := ordinary div 2;
  end;

end;
Code:
Funktionsaufruf:
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  Memo2.Lines.Clear();
  OpenPictureDialog1.Execute(); // Öffnen des Öffnen - Dialogs
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); // Laden des Bildes;

  for i := 0 to Length(Memo1.Text) do
  begin

    Memo2.Text := Memo2.Text + CharToBin(ord(Memo1.Text[i]));

  end;

end;
Ein einzelner Buchstabe wird korrekt ausgegeben. Bei zwei bekomme ich irgendwie 3 Binärcodes und naja. irgendwas stimmt nicht und ich finde den Fehler von der Logik nicht. :S

Elexarie 15. Sep 2012 11:28

AW: Dezimal -> Binär
 
Hab den Fehler gefunden. Es lag am Memo1.Text + Funktionsaufruf.

Jetzt ist meine Frage.

Mein Code wird irgendwie rückwärts ausgegeben, ist das richtig?! :O

http://imagr.eu/up/505459fd6ddc92_Unbenannt.png

himitsu 15. Sep 2012 11:38

AW: Dezimal -> Binär
 
Zitat:

Zitat von Elexarie (Beitrag 1182990)
Mein Code wird irgendwie rückwärts ausgegeben, ist das richtig?! :O

Du hast doch diesen Code geschrieben ... Das mußt du doch wissen?

Aber ja, du fügst die kleinesten Bits vorne in den Ergebnis-String ein, also ja, wenn du rückwärts schreibst, dann ist das Ergebnis auch rückwärts.

Und du solltest dir unbedingt angewöhnen deine Result-Variablen zu initialisieren.

Delphi-Quellcode:
function CharToBin(ordinary: integer): string;
var ergebnis : integer;
begin
  Result := '';
  while ordinary > 0 do
Result hat hier nur zufällig gleich beim Start einen Leerstring drin und das muß nicht immer so sein, also solltest du unbedingt dafür sorgen, daß es immer so ist.

Bummi 15. Sep 2012 11:41

AW: Dezimal -> Binär
 
// Deteted
ich hatte Hex2Bin gelesen, sorry ...

Elexarie 15. Sep 2012 11:51

AW: Dezimal -> Binär
 
Wenn ich bei am Beginn meiner CharToBin Funktion
Code:
Result := '';
verwende, dann gibt meine Funktion nichts mehr an den Aufruf weiter.

Wenn ich Result nicht initialisiere funktioniert der folgende Code:

Code:


function CharToBin(ordinary: integer): string;
var ergebnis : integer;
begin

  while ordinary > 0 do

  begin
    ergebnis := ordinary mod 2;
    if ergebnis = 1 then
      result := '1' + result
    else
      result := '0' + result;
    ordinary := ordinary div 2;
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  Memo2.Lines.Clear();
  OpenPictureDialog1.Execute(); // Öffnen des Öffnen - Dialogs
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); // Laden des Bildes;

  for i := Length(Memo1.Text) downto 0 do
  begin

    Memo2.Text := CharToBin(ord(Memo1.Text[i]));


  end;
while Length(Memo2.Text) mod 3 > 0 do
Memo2.Text := Memo2.Text + '0';
ShowMessage(inttostr(Length(Memo2.Text)));
end;

end.

Bummi 15. Sep 2012 12:00

AW: Dezimal -> Binär
 
// Deteted
ich hatte Hex2Bin gelesen, sorry 2...

Bjoerk 15. Sep 2012 12:02

AW: Dezimal -> Binär
 
Hast du das Result auch am Begin der function (vor dem while) stehen? Außerdem, das mit dem Rückwärts kann nicht stimmen, du schreibst ja 0/1 + Result statt Result + 0/1. Und Strings beginnen in Delphi mit 1 und Memo.Text ist ein String.

himitsu 15. Sep 2012 12:06

AW: Dezimal -> Binär
 
Zitat:

Zitat von Elexarie (Beitrag 1182996)
Wenn ich Result nicht initialisiere funktioniert der folgende Code:

Einfach mal alles durchlesen.
http://www.delphipraxis.net/170301-r...efensuche.html


Tipp: Wenn dein Code nicht funktioniert und du weißt nicht warum,
dann könnte man den Debugger verwenden und sich ansehn, was der Code überhaupt macht und was da nicht so läuft, wie man es gern hätte.


Delphi-Quellcode:
if ergebnis = 1 then
und
Delphi-Quellcode:
if Ord(ergebnis) then
kommt fast auf das Selbe raus.
Hier kommt es sogar genau auf's Selbe raus da
Delphi-Quellcode:
ordinary
nur positive Werte enthält.

p80286 16. Sep 2012 11:29

AW: Dezimal -> Binär
 
wie wäre es ein Byte zu übersetzen?
Delphi-Quellcode:
function BytetoBin(inb:byte):string;
type
  tnibbbin = string[4];
const
  ba : array [0..15] of tnibbin=('0000','0001',
                                 '0010','0011',
                                 '0100','0101',
                                 '0110','0111',
                                 '1000','1001',
                                 '1010','1011',
                                 '1100','1101',
                                 '1110','1111')
begin
  result:=ba[inb shr 4 ]+ba[inb and $0F];
end;

...
{für 8Bit Char }
ergeb:='';
for i:=1 to length(mystring) do
  ergeb:=ergeb+BytetoBin(Byte(mystring[i]));
Gruß
K-H


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