Writing extended ascii characters to text file.

  • Thread starter Thread starter JSM
  • Start date Start date
J

JSM

Hi,

I am just trying to port an existing simple encryption routine to C#. this
routine simply adds/substracts 10 ascii characters to each character in a
text file (except quotes). The routine for decrypting the file works fine
however when I encrypt the file, several characters are corrupted. when I
looked into it they are always extended ascii characters (eg "x" which is
ascii character 120 gets translated to ascii character 130 which is part of
the extended ascii range of characters). I am assuming this has something to
do with the Encoding which I used to read/write the text files but I just
can't seem to get it to work. I have tried specifying all different types of
encoding (Unicode, Ascii, UTF7/8 without success).

I can't change the encryption method because this needs to work with
existing installations of my application.

Below are the two routines. Any ideas ? I thought this would be a very
simple task but alas I was wrong!

Cheers,

John
--------------------------------------

public void DecryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false,Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";

for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]-10).To
String();
}
}
sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}


public void EncryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false, Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";
for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]+10).To
String();
}
}

sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}
 
Hi JSM,

First of all, remember that all strings in .NET are internally Unicode
strings, so in order to get real ASCII codes you should use the GetBytes
method of an Encoding instance configured for the ASCII encoding (as far as
I remember there is a static instance accessible as Encoding.Ascii). Now
that you have the bytes with the ASCII codes, you do the encryption and
again, you've got bytes, not characters. Therefore, it seems natural to
write out the resultant bytes in a binary mode where the issue of character
encoding simply is out of the picture.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

JSM said:
Hi,

I am just trying to port an existing simple encryption routine to C#. this
routine simply adds/substracts 10 ascii characters to each character in a
text file (except quotes). The routine for decrypting the file works fine
however when I encrypt the file, several characters are corrupted. when I
looked into it they are always extended ascii characters (eg "x" which is
ascii character 120 gets translated to ascii character 130 which is part
of
the extended ascii range of characters). I am assuming this has something
to
do with the Encoding which I used to read/write the text files but I just
can't seem to get it to work. I have tried specifying all different types
of
encoding (Unicode, Ascii, UTF7/8 without success).

I can't change the encryption method because this needs to work with
existing installations of my application.

Below are the two routines. Any ideas ? I thought this would be a very
simple task but alas I was wrong!

Cheers,

John
--------------------------------------

public void DecryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false,Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";

for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]-10).To
String();
}
}
sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}


public void EncryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false, Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";
for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]+10).To
String();
}
}

sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}
 
JSM said:
I am just trying to port an existing simple encryption routine to C#. this
routine simply adds/substracts 10 ascii characters to each character in a
text file (except quotes). The routine for decrypting the file works fine
however when I encrypt the file, several characters are corrupted. when I
looked into it they are always extended ascii characters (eg "x" which is
ascii character 120 gets translated to ascii character 130 which is part of
the extended ascii range of characters). I am assuming this has something to
do with the Encoding which I used to read/write the text files but I just
can't seem to get it to work. I have tried specifying all different types of
encoding (Unicode, Ascii, UTF7/8 without success).

See http://www.pobox.com/~skeet/csharp/unicode.html to explain a few of
your problems - for a start, look at what the page says about "extended
ASCII"...
 
Thanks for your reply Dimitry.

I am still relatively new to C# - would you have an example which
demonstrates what you had said?

Cheers,

John

Dmitriy Lapshin said:
Hi JSM,

First of all, remember that all strings in .NET are internally Unicode
strings, so in order to get real ASCII codes you should use the GetBytes
method of an Encoding instance configured for the ASCII encoding (as far as
I remember there is a static instance accessible as Encoding.Ascii). Now
that you have the bytes with the ASCII codes, you do the encryption and
again, you've got bytes, not characters. Therefore, it seems natural to
write out the resultant bytes in a binary mode where the issue of character
encoding simply is out of the picture.

--
Sincerely,
Dmitriy Lapshin [C# / .NET MVP]
Bring the power of unit testing to the VS .NET IDE today!
http://www.x-unity.net/teststudio.aspx

JSM said:
Hi,

I am just trying to port an existing simple encryption routine to C#. this
routine simply adds/substracts 10 ascii characters to each character in a
text file (except quotes). The routine for decrypting the file works fine
however when I encrypt the file, several characters are corrupted. when I
looked into it they are always extended ascii characters (eg "x" which is
ascii character 120 gets translated to ascii character 130 which is part
of
the extended ascii range of characters). I am assuming this has something
to
do with the Encoding which I used to read/write the text files but I just
can't seem to get it to work. I have tried specifying all different types
of
encoding (Unicode, Ascii, UTF7/8 without success).

I can't change the encryption method because this needs to work with
existing installations of my application.

Below are the two routines. Any ideas ? I thought this would be a very
simple task but alas I was wrong!

Cheers,

John
--------------------------------------

public void DecryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false,Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";

for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]-10).To
String();
}
}
sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}


public void EncryptFile(string SourceFile,string DestFile)
{
string line;
StreamReader sr=new StreamReader(SourceFile,Encoding.Default);
StreamWriter sw=new StreamWriter(DestFile,false, Encoding.Default);

while ((line=sr.ReadLine())!=null)
{
string newline="";
for (int x=0;x<line.Length;x++)
{
if ((line.Substring(x,1)==qte) ||
(line.Substring(x,1)==Convert.ToChar(44).ToString()))
newline +=line.Substring(x,1);
else
{
newline +=
Convert.ToChar((int)Encoding.Default.GetBytes(line.Substring(x,1))[0]+10).To
String();
}
}

sw.WriteLine(newline);
}

sr.Close();
sw.Close();
}
 
Back
Top