我在MSDN页面中看到了一个很好的例子:http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx
向下滚动到示例的一半,然后查看方法:
// Decrypt a file using a private key.
private static void DecryptFile(string inFile, RSACryptoServiceProvider rsaPrivateKey)
你会注意到阅读器一次只读取3个字节,而它正试图从流中读取一个int:
inFs.Seek(0, SeekOrigin.Begin);
inFs.Read(LenK, 0, 3);// <---- this should be 4
inFs.Seek(4, SeekOrigin.Begin);// <--- this line masks the bug for smaller ints
inFs.Read(LenIV, 0, 3); // <---- this should be 4
由于下一行是Seeking to position"4",因此错误被掩盖了。我说得对吗?或者,这是故意的吗?即,某种奇怪的优化,因为我们知道(在这个例子中)AES密钥和IV的长度将足够小,可以容纳在3个字节中,所以只读取3个字节,然后跳到4个字节,从而节省从磁盘上读取1个字节的时间?
如果优化。。。。真正地
我非常怀疑这是一个优化。磁盘读取往往是大得多的块,缓存会使这种类型的优化失效,除非在极少数情况下,四个字节可能跨越两个不同的磁盘"扇区"(或磁盘读取分辨率)。
这种范式倾向于(例如)只使用三个字节,而实现在那里存储其他信息。
这里并不是说是这样,但你可能想了解某些大公司将字段用于自己目的的历史,尽管标准上说,la"拥抱、扩展、熄灭":-)