Mega Code Archive
Utilities for working with binary strings
Title: Utilities for working with binary strings
Question: Some utility functions...
Answer:
{===============================================================}
{ BinHexTools
{===============================================================}
{ VERSION : 1.0
{ COMPILER : Borland Delphi 3.0
{ AUTHOR : Hans Luyten
{ DATE : 11 juni 1998
{===============================================================}
{ Utilities for working with binary strings
{===============================================================}
{ FUNCTION : RESULTSTRING = HexToBin(HEXSTRING)
{ PURPOSE : Convert a Hex number (string) to a Binary number
{ (string)
{===============================================================}
{ FUNCTION : RESULTINTEGER = HexCharToInt(HEXCHAR)
{ PURPOSE : Convert a Hex character (0..9 & A..F or a..f) to
{ an integer
{===============================================================}
{ FUNCTION : RESULTSTRING = HexCharToBin(HEXCHAR)
{ PURPOSE : Convert a Hex character (0..9 & A..F or a..f) to a
{ binary string
{===============================================================}
{ FUNCTION : RESULTINTEGER = Pow(BASE,POWER)
{ PURPOSE : Simple power routine resulting in an integer
{ (16bit)
{===============================================================}
{ FUNCTION : RESULTINTEGER = BinStrToInt(BINSTRING)
{ PURPOSE : this function converts a 16 bit binary string to
{ an integer
{===============================================================}
{ FUNCTION : RESULTSTRING = DecodeSMS7Bit (PDUSTRING)
{ PURPOSE : this function decodes an 7-bit SMS (GSM 03.38) to
{ ASCII
{===============================================================}
{ FUNCTION : RESULTSTRING = ReverseStr (SOURCESTRING)
{ PURPOSE : this function reverses a string
{===============================================================}
unit BinHexTools;
interface
function HexToBin(HexNr : string): string;
function HexCharToInt(HexToken : char):Integer;
function HexCharToBin(HexToken : char): string;
function pow(base, power: integer): integer;
function BinStrToInt(BinStr : string) : integer;
function DecodeSMS7Bit(PDU : string):string;
function ReverseStr(SourceStr : string) : string;
implementation
uses sysutils, dialogs;
function HexCharToInt(HexToken : char):Integer;
begin
{if HexToken#97 then HexToken:=Chr(Ord(HexToken)-32);
{ use lowercase aswell }
Result:=0;
if (HexToken#47) and (HexToken Result:=Ord(HexToken)-48
else if (HexToken#64) and (HexToken Result:=Ord(HexToken)-65 + 10;
end;
function HexCharToBin(HexToken : char): string;
var DivLeft : integer;
begin
DivLeft:=HexCharToInt(HexToken); { first HEX-BIN }
Result:='';
{ Use reverse dividing }
repeat { Trick; divide by 2 }
if odd(DivLeft) then { result = odd ? then bit = 1 }
Result:='1'+Result { result = even ? then bit = 0 }
else
Result:='0'+Result;
DivLeft:=DivLeft div 2; { keep dividing till 0 left and length = 4 }
until (DivLeft=0) and (length(Result)=4); { 1 token = nibble = 4 bits }
end;
function HexToBin(HexNr : string): string;
{ only stringsize is limit of binnr }
var Counter : integer;
begin
Result:='';
for Counter:=1 to length(HexNr) do
Result:=Result+HexCharToBin(HexNr[Counter]);
end;
function pow(base, power: integer): integer;
var counter : integer;
begin
Result:=1;
for counter:=1 to power do
Result:=Result*base;
end;
function BinStrToInt(BinStr : string) : integer;
var counter : integer;
begin
if length(BinStr)16 then
raise ERangeError.Create(#13+BinStr+#13+
'is not within the valid range of a 16 bit binary.'+#13);
Result:=0;
for counter:=1 to length(BinStr) do
if BinStr[Counter]='1' then
Result:=Result+pow(2,length(BinStr)-counter);
end;
function DecodeSMS7Bit(PDU : string):string;
var OctetStr : string;
OctetBin : string;
Charbin : string;
PrevOctet: string;
Counter : integer;
Counter2 : integer;
begin
PrevOctet:='';
Result:='';
for Counter:=1 to length(PDU) do
begin
if length(PrevOctet)=7 then { if 7 Bit overflow on previous }
begin
if BinStrToInt(PrevOctet)0 then
Result:=Result+Chr(BinStrToInt(PrevOctet))
else Result:=Result+' ';
PrevOctet:='';
end;
if Odd(Counter) then { only take two nibbles at a time }
begin
OctetStr:=Copy(PDU,Counter,2);
OctetBin:=HexToBin(OctetStr);
Charbin:='';
for Counter2:=1 to length(PrevOctet) do
Charbin:=Charbin+PrevOctet[Counter2];
for Counter2:=1 to 7-length(PrevOctet) do
Charbin:=OctetBin[8-Counter2+1]+Charbin;
if BinStrToInt(Charbin)0 then Result:=Result+Chr(BinStrToInt(CharBin))
else Result:=Result+' ';
PrevOctet:=Copy(OctetBin,1,length(PrevOctet)+1);
end;
end;
end;
function ReverseStr(SourceStr : string) : string;
var Counter : integer;
begin
Result:='';
for Counter:=1 to length(SourceStr) do
Result:=SourceStr[Counter]+Result;
end;
end.