Application Center - Maplesoft

App Preview:

ASCII padding

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

ASCII PADDING

by Marion Scheepers

This worksheet consists of ASCII conversion procedures like ASCIIPad(..,..) and ASCIIDepad(...).

> with(numtheory):

Warning, the protected name order has been redefined and unprotected

ASCIIPad(..,..)

First argument: A string of characters listed between ` and `.
Second argument: A "large" natural number.

>
ASCIIPad:=proc(Message,Modulus)
local L, K, l, x, p, r, M, j, i, z;
L:= length(Modulus);
K:=convert(Message,bytes);
l:=nops(K);
x:=floor(L/4); ## This computes length of a packet.
if ( l mod x = 0) then
p:= l/x; ## This is the number of packets - Case 1.
r:= 0; ## This keeps track of the case.
else
p:= floor(l/x)+1; ## This is the number of packets - Case 2.
r:= 1;
fi:

if (r = 0) then
for j from 1 to p do
M:=0; ## This starts packet j's padded ascii
for i from 1 to x do
if (i < x) then
M:= (M + (1000 + K[(j-1)*x+i]))*10000;
else
M:= (M + (1000 + K[j*x]));
fi:
od:

printf("Packet number %d of the padded ASCII is %d\n",j,M);

od:

else
if ( p = 1) then
M:=0;
for i from 1 to l do
if (i < l) then
M:= (M + (1000 + K[i]))*10000;
else
M:= (M + (1000 + K[i]));
fi:
od:

printf("The padded ASCII version is %d \n",M);

else
for j from 1 to p do
M:=0;
if (j < p) then
for i from 1 to x do
if (i < x) then
M:= (M + (1000 + K[(j-1)*x+i]))*10000;
else
M:= (M + (1000 + K[j*x]));
fi:
od:

printf("Packet number %d of the padded ASCII is %d\n",j,M);

else
z := l mod x;
for i from 1 to z do
if (i < z) then
M:= (M + (1000 + K[(p-1)*x+i]))*10000;
else
M:= (M + (1000 + K[(p-1)*x+z]));
fi:
od:

printf("Packet number %d of the padded ASCII is %d\n",p,M);

fi:
od:
fi:
fi:
end:


Example.

> Modulus:=nextprime(11^53);
Message:=`Where have all the flowers gone?`;
ASCIIPad(Message,Modulus);

Modulus := 1562472251828744662703731061631669238387...

Message := `Where have all the flowers gone?`

Packet number 1 of the padded ASCII is 10871104110111141101103211041097111811011032109711081108

Packet number 2 of the padded ASCII is 10321116110411011032110211081111111911011114111510321103

Packet number 3 of the padded ASCII is 1111111011011063

>


ASCIIDepad(...)

Given a number, this checks to see if it is padded ASCII, and if so, converts it back to a list of ASCII values.

>
ASCIIDepad:=proc(Expression)
local l, M, j, N, X;
l:=length(Expression);
if (l mod 4 > 0) then
printf(" This is not a padded ASCII string.\n");
else
M:= Expression;
for j from 1 to (l/4) do
X[j]:=((M mod 10^(l-4*(j-1)) - (M mod 10^(l-4*j)))/(10^(l-4*j)))-1000;
if (j = 1) then
N:=[X[j]];
else
N:=[op(N),X[j]];
fi:
if( X[j] > 256 ) then
printf(" This is not a padded ASCII string.\n");
break;
fi:
od:
fi:
RETURN(N);
end:


Example

> X:=10321116110411011032110211081111111911011114111510321103;
Z:=ASCIIDepad(X);

X := 1032111611041101103211021108111111191101111411...

Z := [32, 116, 104, 101, 32, 102, 108, 111, 119, 10...

> convert(Z,bytes);

>