Solved

Binary to Text, Text to Binary - Part II

Posted on 2010-09-14
3
695 Views
Last Modified: 2012-08-14
I would like to refine some work i had help on

see: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_26470056.html

I have two memos and two convert buttons

Convert Binary to text button (Converts Binary in memOne and displays text in memTwo)

Convert Text to Binary button (Converts text in memOne and displays binary in memTwo)

see code below (by EE expert - epasquier)

I would like to have one Tmemo, and one button (convert)

Is this possible

When the convert button is clicked, it checks the Tmemo and determines if the memo is all zeros and ones and then converts to words (text), else it checks to see that its just words (text) and then converts to binary


thanks
procedure TfrmConversionsBinary.btnConvertBinarytoTextClick(Sender: TObject);

begin

 memTwo.Lines.Text:= BinToString(memOne.Lines.Text, True);

end;



procedure TfrmConversionsBinary.btnConvertTexttoBinaryClick(Sender: TObject);

begin

 memTwo.Lines.Text:= StringToBin(memOne.Lines.Text);

end;







//******************** BINARY *************************



function BinToInt(Bin:String;ThrowException:Boolean=False):Cardinal;

Var

 i,L:integer;

begin

 Result:=0;

 i:=1;

 L:=Length(Bin);

 While i<=L do

  begin

   Result:=Result SHL 1;

   if Bin[i]='1'

    Then Inc(Result)

    Else if ThrowException And (Bin[i]<>'0')

     Then Raise Exception.Create('Invalid binary digit in ['+Bin+']');

   Inc(i);

  end;

end;



function IntToBin(C:Cardinal;Digits:Byte=8):String;

Var

 N:Byte;

Const

 Bits='01';

begin

 Result:='';

 N:=0;

 While (C>0) Or (N=0) Or ((N Mod Digits)>0) do

  begin

   Result:=Bits[(C And 1)+1]+Result;

   C:=C SHR 1;

   Inc(N);

  end;

end;



function StringToBin(S:String):String;

Var

 i:integer;

begin

 Result:='';

 for i:=1 to Length(S) do Result:=Result+IntToBin(Ord(S[i]));

end;



function BinToString(S:String;ThrowException:Boolean=False):String;

Var

 N:Integer;

begin

 Result:='';

 N:=Length(S);

 if ThrowException And ((N Mod 8)>0) Then Raise Exception.Create('Number of binary digits must be a multiple of 8');

 While N>0 do

  begin

   Result:=Result+Char(BinToInt(Copy(S,1,8),ThrowException));

   S:=Copy(S,9,N);

   N:=N-8;

  end;

end;





//******************** END BINARY *************************

Open in new window

0
Comment
Question by:Looking_4_Answers
  • 2
3 Comments
 
LVL 25

Accepted Solution

by:
epasquier earned 500 total points
ID: 33676896
Try to convert BinToString with ThrowException = True.
If the source is not compatible with Binary representation of some text, then it will raise an exception.
Trap that exception, and in this case you convert the string to binary, which always succeed.
procedure TfrmConversionsBinary.btnConvertBinarytoTextClick(Sender: TObject);

begin

 try

  memOne.Lines.Text:= BinToString(memOne.Lines.Text, True);

 except

  memOne.Lines.Text:= StringToBin(memOne.Lines.Text);

 end; 

end;

Open in new window

0
 
LVL 3

Expert Comment

by:NevTon
ID: 33678115
Hi,

Better way is to examine the memo in a loop (I hope that this text is not very large) for having something else than zeros and ones.
This always work.
If in this memo is only 0 and 1 convert to text else this is text, convert it to bins.

function ToBins(AText: String): String;
var
  i: Integer;

  function dectobin(dec: Byte): String;
  var
    j: Byte;
  begin
    Result:='';
    for j:=0 to 7 do begin
      if (dec shr (7 - j) and 1) = 1 then
        Result:=Result + '1'
      else
        Result:=Result + '0';
    end;
  end;

begin
  Result:='';
  for i:=1 to Length(AText) do begin
    Result:=Result + dectobin(ord(AText[i]));
  end;
end;

function ToText(ABins: String): String;
var
  i: Integer;

  function bintodec(bin: String): Byte;
  var
    j: Byte;
  begin
    Result:=0;
    if Length(bin) < 8 then
      Exit;
    for j:=1 to 8 do begin
      if bin[j] = '1' then
        Result:=Result + (1 shl (8 - j));
    end;
  end;

begin
  Result:='';
  for i:=1 to (Length(ABins) div 8) do begin
    Result:=Result + chr(bintodec(Copy(ABins, 1, 8)));
    Delete(ABins, 1, 8);
  end;
end;

function IsBins(AText: String): Boolean;
var
  i: Integer;
begin
  Result:=True;
  for i:=1 to Length(AText) do begin
    if not (AText[i] in ['0', '1']) then
      Result:=False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsBins(Memo1.Lines.Text) then
   Memo1.Lines.Text:=ToText(Memo1.Lines.Text)
 else
   Memo1.Lines.Text:=ToBins(Memo1.Lines.Text);
end;

Open in new window

0
 
LVL 25

Expert Comment

by:epasquier
ID: 33690064
Hi Looking_4_Answers !

Have you tried the solution I provided ?
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…
A company’s greatest vulnerability is their email. CEO fraud, ransomware and spear phishing attacks are the no1 threat to a company’s security. Cybercrime is responsible for the largest loss of money to companies today with losses projected to r…

919 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now