@Override
    public FileInfo getFileInfo(String groupName, String remoteFileName) throws FdfsException {
        int fileNameLength =
                FDFS_FILE_PATH_LEN + FDFS_FILENAME_BASE64_LENGTH + FDFS_FILE_EXT_NAME_MAX_LEN + 1;
        if (remoteFileName.length() < fileNameLength) {
            return null;
        }
        byte[] buff =
                base64.decodeAuto(remoteFileName.substring(FDFS_FILE_PATH_LEN, FDFS_FILE_PATH_LEN
                        + FDFS_FILENAME_BASE64_LENGTH));

        long fileSize = Bytes.bytes2long(buff, 4 * 2);
        if (((remoteFileName.length() > TRUNK_LOGIC_FILENAME_LENGTH) || ((remoteFileName.length() > NORMAL_LOGIC_FILENAME_LENGTH) && ((fileSize & TRUNK_FILE_MARK_SIZE) == 0)))
                || ((fileSize & APPENDER_FILE_SIZE) != 0)) { // slave
                                                             // file
                                                             // or
                                                             // appender
                                                             // file
            FileInfo fileInfo = this.queryFileInfo(groupName, remoteFileName);
            return fileInfo;
        }

        FileInfo fileInfo = new FileInfo(fileSize, 0, 0, getIpAddress(buff, 0));
        fileInfo.setCreateTimestamp(new Timestamp(Bytes.bytes2int(buff, 4)));
        if ((fileSize >> 63) != 0) {
            fileSize &= 0xFFFFFFFFL; // low 32 bits is file size
            fileInfo.setFileSize(fileSize);
        }
        fileInfo.setCrc32(Bytes.bytes2int(buff, 4 * 4));
        return fileInfo;
    }