长文件名累加和的计算程序,请高手指点“ ((Sum & 1) ? 0x80 : 0) ”是什么?
然后,文件系统会在目录建立时计算出一个8-bit 的校验和,这个校验和由短目录项文件名中 11 个字符计算得出,然后保存在每一个长目录项中,如果保存在长目录项中的校验和与计算结果不同,这个目
录项便会被认为是孤立的,如果早期版本的MS-DOS/Windows 挂上(mount)了含有长目录项的磁盘,那么在
改文件名时只有短目录名会被改变,这样便会出现长目录项中的校验和与计算结果不符的现象。
校验和的算法如下,用C 语言描述:
//-----------------------------------------------------------------------------
// ChkSum ()
// 返回一个字节长度的无符号校验和,此校验和由一无符号字节数组计算得出,此数组长度必须为
// 11,同时假设数组包含的是MS-DOS 格式的文件名
// Passed: pFcbName 指向长度为11 的无符号字节数组指针,
// Returns: Sum 由pFcbName 数组计算得出的8-bit 无符号校验和
//------------------------------------------------------------------------------
unsigned char ChkSum (unsigned char *pFcbName)
{
short FcbNameLen;
unsigned char Sum;
Sum = 0;
for (FcbNameLen=11; FcbNameLen!=0; FcbNameLen--) {
// NOTE: 运算为无符号字符循环由移
Sum = ((Sum & 1) ? 0x80 : 0) + (Sum >> 1) + *pFcbName++;
}
return (Sum);
}
最后我们得出这样的结论:短目录项的结构包含最后访问日期,创建日期,第一个簇的簇号和文件.
大小,当然,还包括早期的MS-DOS/Windows 可以识别的短目录名。长目录项不再重复这些可以从短目录项
取得的信息,因而有更多的空间去容纳其他信息,这些空间主要作用于存储长目录名。与长目录项配对的
短目录项所包含的文件名我们也称作“别名”(alias, alias name)。