#define CHARACTER 11
char *szBuf;
szBuf = (char *)malloc(CHARACTER);
memcpy(szBuf,dir,CHARACTER);
if (NULL == szBuf)
{
return 0;
}
int i;
int ret=0;
for (i=11; i>0; i--)
ret = ((ret & 1) ? 0x80 : 0) + (ret >> 1) + *szBuf++;以上是通过短文件名计算长文件名的公式,可是结果始终不正确,是否是算法有错误?请指教

解决方案 »

  1.   

    for (i=11; i>0; i--) 
    {
    ret = ((ret & 1) ? 0x80 : 0) + (ret >> 1) + (*szBuf); //地址加,非内容加
    szBuf++; 
    }
      

  2.   

    //别写那么复杂,简单点
     for (i=11,j = 0; i>0; i--) 
        {
            ret = ((ret & 1) ? 0x80 : 0) + (ret >> 1) + szBuf[j++];
        }
      

  3.   

    这样我也试过,结果还是不正确。WHY
      

  4.   


    短文件名确认是正确的,就不是知道为什么不正确。能否用WINHEX抓个图,标示一下呢?
      

  5.   

    你的代码也是对的。我没仔细看。是不是int 和 unsigned char的问题?
      

  6.   

    看看这个:
    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,当然会不对了
      

  7.   

    需要注意的是:FAT的文件名和其他参数一定都是无符号型的。如果用有符号型,>>肯定会出错的了。
      

  8.   

    感谢zczl24 ,lfchen ,cnzdgs 的回帖,接帖.
      

  9.   

    对于255以下的数,用unsigned char和用int是一样的,用int时,高24位都是0,不会影响右移操作。