|
Alright up to you, you're just making it harder though
|
|
|
|
|
Hello!
I am trying to write an app that will read a file and generate an RFC 1321 compliant MD5 hash.
I have read a number of tutorials online and have been able to generate a compliant MD5 hash from a string, but I need to be able to pass my app a file and say "what is the MD5 hash of this file?".
Apparently I can read the file in to a byte array and then convert this to a string that my MD5 hash generator can read.
So far I have hit 2 problems:
- My byte[] conversion to string is resulting in an incorrect MD5 hash to all the web generators I have tried.
- I cannot read the byte[] of a file over 2 gigabytes (a buffering is needed I'm told?).
Any chance someone could help me out here? Ignore the part where I am setting the textbox.text value this was just for debug!
private void button1_Click(object sender, EventArgs e) {
Byte[] byteArray = File.ReadAllBytes("C:\\ITV-9C-28225-C.xml");
String stringFromByteArray = Convert.ToBase64String(byteArray);
textBox2.Text = MD5Hash(stringFromByteArray);
}
public static string MD5Hash(string text) {
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
return System.Text.RegularExpressions.Regex.Replace(BitConverter.ToString(md5.ComputeHash(ASCIIEncoding.Default.GetBytes(text))), "-", "");
}
Cheers in advance!
|
|
|
|
|
Well no wonder, you first make it into base64, and then use that as raw bytes - that does not make any sense in any way.
If you want to use ReadAllBytes, then at least pass the bytes to the MD5 object as bytes. Or if you have to use base64, decode it first
System.Security.Cryptography.MD5 has a ComputeHash which takes a Stream as argument.
|
|
|
|
|
Why you are converting the byte array into a base-64 string and then calculating the hash on the string? You can calculate the hash directly on the byte array, probably that is the reason because your hash in incorrect.
Also, why you are using Regex.Replace instead of the regular string.Replace?
For your 2nd problem, you can calculate the hash on a stream instead than on a byte array (that has a limit of 2Gb).
The following code summarizes what you have to do:
public static string MD5Hash(string filename)
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
using (Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "");
}
}
Much simpler, don't you think?
modified on Friday, June 19, 2009 10:19 AM
|
|
|
|
|
Fantastic! Thank you so much for your help everyone this is working lovely
|
|
|
|
|
Hi,
as Harold said, just do:
MD5CryptoServiceProvider p=new MD5CryptoServiceProvider();
using (FileStream stream=new FileStream(filename, FileMode.Open, FileAccess.Read)) {
byte[] hash=p.ComputeHash(stream);
...
}
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
Please I need help on this problem.
I have an application am writing using visual c# 2008. The isuse is this I want connection string to the database to be read from a file save elsewhere on the system because after package and installation of the application if there is any changes in the connection parameter i will just change it in the file insted of changing it in the code and package it again. Onformload, he read the connection file and connect to database.
Thanks
Ademola
|
|
|
|
|
Did you ever heard of the App.config? Click on your project in VS, select "Add new element" and choose "application settings file" from the dialog. You can access the config with System.Configuration.ConfigurationManager.ConnectionStrings.
Have a look here: http://www.ezzylearning.com/tutorial.aspx?tid=8067328[^]
Regards
Sebastian
|
|
|
|
|
And the question ist ??
I think, what you need is how to write the connection string to a file, is that write ?
When yes, then use :
string connectionString = "...abc...";
File.WriteAllText(@"c:\myfile.txt", connectionString);
string connectionString = File.ReadAllText(@"c:\myfile.txt");
You must also encrypt your connection string before write it to a file.
You don't want anybody to know your database password, do you ?..
|
|
|
|
|
stancrm wrote: You must also encrypt your connection string before write it to a file.
You don't want anybody to know your database password, do you
You can't make it impossible. If you encrypt it, well, your program would contain the code to decrypt it. And they will have that code.
The same problem applies to all local data and is impossible to solve, though you could make the chain of encrypted keys of arbitrary length to slow the attacker down.
Edit (used to be something here about encrypted connection strings): scratch that, it's just impossible as well. Great. So now we know you don't even need to try to hide your connection string, at least that saves us all some effort.
|
|
|
|
|
File.WriteAllText(@"c:\myfile.txt", connectionString);
string connectionString = File.ReadAllText(@"c:\myfile.txt");
thanks but File will be declare as what in this context?
|
|
|
|
|
You don't declare File , it already exists.
|
|
|
|
|
Probably this may help you.
Success is the good fortune that comes from aspiration, desperation, perspiration and inspiration.
|
|
|
|
|
I would use App.config aswell as SeMartens describes, but if you prefer to use a seperate file other than App.config, why not make the main program retrieve the connectionstring from a seperate class with a static method and just have that as a dll file. Then if the connectionstring should change you only have to replace the dll with a new one.
modified on Saturday, June 20, 2009 5:15 PM
|
|
|
|
|
Hi,
I am sending emails with attachment(.txt file) using c#.
I read data from database saved as varchar datatype. I read data in memory stream and output the memory stream as attachment with content type text(.txt file).
It sends emails to gmail, yahoo,hotmail,rediff etc. mail servers with attachment(which is a .txt file) perfectly fine.
(It means there is no problem with code)
But when i send emails to my own mail server it skips the attachment i.e. i get the emails without attachment.
Please help me asap.
What could be the reason?
My mail server IP is 72.9.144.139
Thanks,
Dev
|
|
|
|
|
1) Don't mark your post as Urgent, it's rude and will not get any attention from those who could best help
2) Don't include your server IP address on a public forum. Unless you want your mail server to be used for sending spam.
Could it be that your server is blocking the attachments?
only two letters away from being an asset
|
|
|
|
|
Thanks for your precious suggestions.
We use to send emails with attachment to and from our mail server.
We get emails with attachment from other mail servers also.
I don't think that our server is blocking attachment.
|
|
|
|
|
You thank for help and yet leave the ip address. Interesting.
Panic, Chaos, Destruction.
My work here is done.
|
|
|
|
|
The edit button is commonly overlooked by new CP members
SEE THIS IS AN EDIT:
Now all he needs to do is edit his OP and remove IP Address: [REMOVED] so no one can see it...
Oops
Life goes very fast. Tomorrow, today is already yesterday.
modified on Friday, June 19, 2009 9:38 AM
|
|
|
|
|
Why make it worse by highlighting the fact he left his mail server IP address, not that it's anything important or useful to the outside world, it can be resolved with a DNS request. But either way, why repeat it and take attention to his error?
|
|
|
|
|
I'm just playing with him, and if the error was not pointed out then how would he know not to do it in the future?
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
dev sheoran wrote: (It means there is no problem with code)
So why are you posting in a programming forum? Sounds like some setup on your server.
Anyway, thanks for the IP address. I'm sure I could have some fun with that
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Hi,
I just started to work for a retail company where I am supposed to handle large databases. I need to transfer data from AS400 to MS Access where I will use for reporting purposes.
When I use dataset I receive memory exception. Is it possible to transfer data directly without using dataset(means without using virtual memory).
Thanks in advance
|
|
|
|
|
Why would they want to transfer the data to Access Do they realize there are reporting solutions that will work without the transfer. Or at least use SQL Server, Express is free and coupled with SSRS it would be better than Access, IMHO
You could do it with a datareader, transfer one record at a time.
only two letters away from being an asset
|
|
|
|
|
Access can be a very good reporting tool but the problem with many Access users is that they tend to want to import the data into access and then report on it. Instead, you should create linked tables in access and then create parameterised queries on which to base the reports. Doing so will ensure that only the data you're reporting on gets copied temporarily into access
|
|
|
|