?
Solved

Binary to Text, Text to Binary - Part II

Posted on 2010-09-14
3
Medium Priority
?
722 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 25

Accepted Solution

by:
epasquier earned 2000 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Suggested Courses
Course of the Month11 days, 3 hours left to enroll

770 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