我在C#中组合了一个程序,该程序假设在RSA中加密和解密所需的时间,然后显示时间。我将秒表对象放入加密和解密方法,而不是自己创建方法。无论我尝试过什么,输出总是00:00:00:00。
public void EncryptFile(string inFile)
{
Stopwatch stopWatch = new Stopwatch();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
stopWatch.Start();
// Create instance of Rijndael for
// symetric encryption of the data.
RijndaelManaged rjndl = new RijndaelManaged();
rjndl.KeySize = 256;
rjndl.BlockSize = 256;
rjndl.Mode = CipherMode.CBC;
ICryptoTransform transform = rjndl.CreateEncryptor();
// Use RSACryptoServiceProvider to
// enrypt the Rijndael key.
// rsa is previously instantiated:
// rsa = new RSACryptoServiceProvider(cspp);
byte[] keyEncrypted = rsa.Encrypt(rjndl.Key, false);
// Create byte arrays to contain
// the length values of the key and IV.
byte[] LenK = new byte[4];
byte[] LenIV = new byte[4];
int lKey = keyEncrypted.Length;
LenK = BitConverter.GetBytes(lKey);
int lIV = rjndl.IV.Length;
LenIV = BitConverter.GetBytes(lIV);
// Write the following to the FileStream
// for the encrypted file (outFs):
// - length of the key
// - length of the IV
// - ecrypted key
// - the IV
// - the encrypted cipher content
int startFileName = inFile.LastIndexOf("\\") + 1;
// Change the file's extension to ".enc"
string outFile = EncrFolder +
inFile.Substring(startFileName,
inFile.LastIndexOf(".") - startFileName) + ".enc";
using (FileStream outFs = new FileStream(outFile, FileMode.Create))
{
outFs.Write(LenK, 0, 4);
outFs.Write(LenIV, 0, 4);
outFs.Write(keyEncrypted, 0, lKey);
outFs.Write(rjndl.IV, 0, lIV);
// Now write the cipher text using
// a CryptoStream for encrypting.
using (CryptoStream outStreamEncrypted =
new CryptoStream(outFs, transform, CryptoStreamMode.Write))
{
int count = 0;
int offset = 0;
// blockSizeBytes can be any arbitrary size.
int blockSizeBytes = rjndl.BlockSize / 8;
byte[] data = new byte[blockSizeBytes];
int bytesRead = 0;
using (FileStream inFs = new FileStream(inFile, FileMode.Open))
{
do
{
count = inFs.Read(data, 0, blockSizeBytes);
offset += count;
outStreamEncrypted.Write(data, 0, count);
bytesRead += blockSizeBytes;
} while (count > 0);
inFs.Close();
}
outStreamEncrypted.FlushFinalBlock();
stopWatch.Stop();
// Format and display the TimeSpan value.
string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
label3.Text = "Elapsed time " + elapsedTime;
outStreamEncrypted.Close();
}
outFs.Close();
}
}
答案 0 :(得分:4)
您记录开始计时之前经过的时间(因此它显然为零):
TimeSpan ts = stopWatch.Elapsed;
stopWatch.Start();
然后,在停止计时之后,请参考ts
,但您永远不会更新ts
的值。
stopWatch.Stop();
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
相反,您需要在停止计时之后检查经过的时间 - 将ts
的声明和初始化移至Stop
之后:
stopWatch.Stop();
// Format and display the TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
答案 1 :(得分:1)
您似乎在string.Format
方法中使用了变量ts,但在调用stopWatch.ElapsedTime
后,它看起来并未设置为stopWatch.Stop()
。< / p>
答案 2 :(得分:1)
TimeSpan是一种值类型,您不能只指定TimeSpan ts = stopWatch.Elapsed;
并期望它发生变化。使用stopWatch.Elapsed而不是将其分配给时间滞留的变量。
答案 3 :(得分:1)
停止计时器后经过的时间。
stopWatch.Start()
// Your code Here
stopWatch.Stop()
TimeSpan ts = stopWatch.Elapsed
可以使用
ts.Hours,
ts.Minutes,
ts.Seconds,
ts.Milliseconds
ts.Ticks
表示小时,分钟,秒,毫秒和Ticks