FAT长文件名 校验和算法 例子分析
#include <stdio.h>
#include <string.h>
unsigned char ChkSum (unsigned char *pFcbName)
{
short FcbNameLen;
unsigned char Sum; //必须为无符号型.
Sum = 0;
for (FcbNameLen=11; FcbNameLen!=0; FcbNameLen--) {
// NOTE: The operation is an unsigned char rotate right
Sum = ((Sum & 1) ? 0x80 : 0) + (Sum >> 1) + *pFcbName++;
}
return (Sum);
}
int main(int argc, const char *argv[])
{
if(argc != 2)
{
return -1;
}
unsigned char shortname[12] = {0};
shortname[11] = 0;
strncpy((char*)shortname,argv[1],11);
printf("argv[1] = %s\n",argv[1]);
printf("shortname = %s\n",shortname);
printf("ChkSum = 0x%02x\n",ChkSum(shortname) );
return 0;
}
[user:test] ./a.out "ABCDEF~42 " //42后面是两空格.我的文件全名是abcdefghijk3.2
argv[1] = ABCDEF~42
shortname = ABCDEF~42
ChkSum = 0x2f
需要注意的是:FAT的文件名和其他参数一定都是无符号型的。
如果用有符号型,>>肯定会出错的了。