Xiaofei Ji

32 papers B 3C 3Misc 1Journal 17Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neurocomputing
Xiaofei Ji, Sixu Zhao, Jiangtao Cao
2026 J jnl
Discov. Artif. Intell.
Jiangtao Cao, Wang Li, Jinli Dai, Xiaofei Ji
2025 J jnl
IEEE Access
Shishuan Guan, Lei Jiao, Zengyu Wang, Xiaofei Ji, Hongwei Zheng, Cunfeng Yu, Hongtao Li, Liwen Zheng, Shuaishuai Sun, Qiang Sun, Jun Li, Guangwei Jiang, Kezhi Wu, Erge Lin, Xinlong Zhang
2024 J jnl
Int. J. Intell. Robotics Appl.
Xiaofei Ji, Shuai Zhao, Junpeng Li
2024 J jnl
IEEE Access
Lei Jiao, Shishuan Guan, Kezhi Wu, Xiaofei Ji, Cunfeng Yu, Xinlong Zhang, Zengyu Wang, Shuaishuai Sun, Hongtao Li, Liwen Zheng, Jun Li, Guangwei Jiang, Qiang Sun, Erge Lin, Hongwei Zheng
2023 J jnl
Int. J. Intell. Robotics Appl.
Xiaofei Ji, Yazhou Li, Kailin Hong, Jiangtao Cao
2023 C conf
CSCWD
Haozhe Wu, Hua Dai, Weihong Yang, Guineng Zheng, Meng Lu, Xiaofei Ji
2023 J jnl
IET Image Process.
Jianfang Cao, Zeyu Chen, Hongyan Cui, Xiaofei Ji, Xianhui Wang, Yunchuan Liang, Yun Tian
2021 J jnl
Int. J. Autom. Comput.
Yueyan Qin, Jiangtao Cao, Xiaofei Ji
2020 J jnl
Multim. Tools Appl.
Yueyan Qin, Jiangtao Cao, Xiaofei Ji, Yu Zhang
2019 conf
ICIRA (5)
Xiaofei Ji, Linlin Qin, Xinmeng Zuo
2019 J jnl
IEEE Access
Yaxu Xue, Xiaofei Ji, Dalin Zhou, Jing Li, Zhaojie Ju
2019 conf
ICIRA (5)
Jiangtao Cao, Peiyao Wang, Shuqi Chen, Xiaofei Ji
2017 J jnl
IEEE Syst. J.
Zhaojie Ju, Xiaofei Ji, Jing Li, Honghai Liu
2017 Misc conf
ICMLC
Xiaofei Ji, Xuan Xie, Xinmeng Zuo, Jiangtao Cao
2017 J jnl
Mob. Inf. Syst.
Xiaofei Ji, Baichuan Chi, Jiangtao Cao
2017 B conf
ICIP
Bangli Liu, Haibin Cai, Xiaofei Ji, Honghai Liu
2016 J jnl
Multim. Tools Appl.
Xiaofei Ji, Zhaojie Ju, Ce Wang, Changhui Wang
2015 conf
ICIRA (1)
Xiaofei Ji, Xinmeng Zuo, Changhui Wang, Yangyang Wang
2015 conf
ICIRA (1)
Yangyang Wang, Yibo Li, Xiaofei Ji, Yang Liu
2014 J jnl
Int. J. Humanoid Robotics
Xiaofei Ji, Ce Wang, Yibo Li
2014 C conf
CIT
Xiaofei Ji, Lu Zhou, Yibo Li
2014 J jnl
Int. J. Humanoid Robotics
Yangyang Wang, Yibo Li, Xiaofei Ji
2014 C conf
CIT
Yangyang Wang, Yibo Li, Xiaofei Ji
2014 J jnl
Int. J. Autom. Comput.
Xiaofei Ji, Qian-Qian Wu, Zhaojie Ju, Yang-Yang Wang
2010 J jnl
IEEE Trans. Syst. Man Cybern. Part C
Xiaofei Ji, Honghai Liu
2010 B conf
FUZZ-IEEE
Xiaofei Ji, Honghai Liu, Yibo Li
2010
Xiaofei Ji
2010 conf
KES (1)
Xiaofei Ji, Honghai Liu, Yibo Li
2009 B conf
FUZZ-IEEE
Jiangtao Cao, Zhaojie Ju, Xiaofei Ji, Honghai Liu
2009 conf
ICIRA
Xiaofei Ji, Honghai Liu
2008 conf
KES (1)
Xiaofei Ji, Honghai Liu, Yibo Li, David J. Brown
redb/s3_utils.py
← Index redb/s3_utils.py python
"""
S3 and file utility functions for REDB.

Contains MinIO/S3 client creation, S3 key generation,
file download, and archive extraction helpers.
"""
import os
import tempfile
from typing import Optional, List

from minio import Minio
from minio.error import S3Error


def get_minio_client():
    """Create and return a Minio client using credentials from .env file"""
    return Minio(
        endpoint=os.getenv("S3_ENDPOINT"),
        access_key=os.getenv("S3_ACCESS_KEY"),
        secret_key=os.getenv("S3_SECRET_KEY"),
        secure=os.getenv("S3_SECURE", "false").lower() == "true"
    )


def generate_s3_key_from_hash(sample_hash: str) -> str:
    """
    Generate S3 key from hash using sharding structure.
    Example: 09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c
    becomes: 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
    """
    if len(sample_hash) < 4:
        raise ValueError(f"Hash too short for sharding: {sample_hash}")

    # Create sharded path: first 2 chars / next 2 chars / full_hash.zip
    return f"{sample_hash[:2]}/{sample_hash[2:4]}/{sample_hash}.zip"


def download_s3_object(s3_bucket: str, s3_key: str, temp_dir: str, logger=None) -> Optional[str]:
    """
    Download an object from S3 to a local temporary directory and return the local path.
    If the .zip file is not found, automatically tries .7z as a fallback for legacy uploads.
    """
    try:
        minio_client = get_minio_client()
        local_path = os.path.join(temp_dir, os.path.basename(s3_key))

        # Download the file
        minio_client.fget_object(s3_bucket, s3_key, local_path)

        return local_path
    except S3Error as e:
        # If .zip not found and error is NoSuchKey, try .7z fallback
        if e.code == 'NoSuchKey' and s3_key.endswith('.zip'):
            s3_key_7z = s3_key[:-4] + '.7z'  # Replace .zip with .7z
            if logger:
                logger.info(f".zip not found, trying .7z fallback: {s3_key_7z}")
            try:
                local_path_7z = os.path.join(temp_dir, os.path.basename(s3_key_7z))
                minio_client.fget_object(s3_bucket, s3_key_7z, local_path_7z)
                if logger:
                    logger.info(f"Successfully downloaded .7z fallback: {s3_key_7z}")
                return local_path_7z
            except S3Error as e2:
                if logger:
                    logger.error(f"Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                else:
                    print(f"[ERROR] Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                return None
        else:
            if logger:
                logger.error(f"Failed to download S3 object {s3_key}: {e}")
            else:
                print(f"[ERROR] Failed to download S3 object {s3_key}: {e}")
            return None


def extract_fat_slices(macho, output_dir: str, logger) -> List[tuple]:
    """
    Extract slices from FAT Mach-O binary using machofile's dump_slices() API.

    Args:
        macho: Parsed machofile.UniversalMachO object
        output_dir: Directory to write slice files
        logger: Logger instance

    Returns:
        List of (arch_name, slice_path, slice_sha256, slice_md5, slice_sha1) tuples
    """
    result = []
    try:
        # Use machofile's dump_slices API (v2026.2.5+)
        slices = macho.dump_slices(output_dir=output_dir)
        logger.debug(f"Extracted {len(slices)} slices from FAT binary")

        for arch_name, slice_path in slices:
            # Get hash info for this slice from machofile
            general_info = macho.get_general_info(arch=arch_name)
            slice_sha256 = general_info.get('SHA256')
            slice_md5 = general_info.get('MD5')
            slice_sha1 = general_info.get('SHA1')
            result.append((arch_name, slice_path, slice_sha256, slice_md5, slice_sha1))
            logger.debug(f"Slice {arch_name}: {slice_sha256}")

    except Exception as e:
        logger.error(f"Error extracting FAT slices: {e}")

    return result