Nan Xing

24 papers C 1Misc 1Journal 11Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Xinyu Yang, Zheheng Jiang, Feixiang Zhou, Yihang Zhu, Na Lv, Nan Xing, Huiyu Zhou
2024 J jnl
Comput. Biol. Chem.
Luo De, Nan Xing, Qinyun Du, Sa Guo, Shaohui Wang
2023 J jnl
Remote. Sens.
Guangyao Chen, Nan Xing, Chengpan Tang, Zhiqiao Chang
2023 J jnl
Expert Syst. Appl.
Sen Du, Hong Zhu, Ge Xiong, Guangfeng Lin, Dong Wang, Jing Shi, Jing Wang, Nan Xing
2022 J jnl
Remote. Sens.
Rui Guo, Dongxia Wang, Nan Xing, Zhijun Liu, Tianqiao Zhang, Hui Ren, Shuai Liu
2021 J jnl
IEEE Access
Nan Xing, Yang Liu, Hong Zhu, Jing Wang, Jungong Han
2020 J jnl
IEEE Trans. Ind. Informatics
Nan Xing, Gabriel A. Rincón-Mora
2020 conf
ISQED
Nan Xing, Gabriel A. Rincón-Mora
2020 conf
ICAIP
Nan Xing, Hong Zhu, Yanghui Li
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Nan Xing, Gabriel A. Rincón-Mora
2017 J jnl
Multim. Tools Appl.
Nan Xing, Jianqi Zhang
2017 conf
MWSCAS
Nan Xing, Gabriel A. Rincón-Mora
2017 conf
ICCSCI
Nan Xing, Siqi Shi, Yuhua Xing
2016 conf
CISP-BMEI
Na Xiao, Dan Liu, Ailing Luo, Xiangwei Kong, Tianshe Yang, Nan Xing, Fangzheng Li
2016 conf
ISIE
Nan Xing, Gabriel A. Rincón-Mora
2013 conf
ISSCC
Tae-Kwang Jang, Nan Xing, Frank Liu, Jungeun Shin, Hyungreal Ryu, Jihyun F. Kim, Taeik Kim, Jaejin Park, Hojin Park
2013 conf
ESSCIRC
Mino Kim, Woo-Yeol Shin, Gi-Moon Hong, Jihwan Park, Joo-Hyung Chae, Nan Xing, Jong-Kwan Woo, Suhwan Kim
2012 conf
ISSCC
Jong-Phil Hong, Sung-Jin Kim, Jenlung Liu, Nan Xing, Tae-Kwang Jang, Jaejin Park, Jihyun F. Kim, Taeik Kim, Hojin Park
2011 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Manho Kim, Hyunjoong Lee, Jong-Kwan Woo, Nan Xing, Min-Oh Kim, Suhwan Kim
2010 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Nan Xing, Jong-Kwan Woo, Woo-Yeol Shin, Hyunjoong Lee, Suhwan Kim
2009 conf
SoCC
Nan Xing, Heesoo Song, Deog-Kyoon Jeong, Suhwan Kim
2009 conf
SoCC
Manho Kim, Nan Xing, Dong-Yong Shin, Hyunjoong Lee, Suhwan Kim
2009 C conf
MoMM
Nan Xing, Imran Shafiq Ahmad
2008 Misc conf
FLAIRS
Nan Xing, Imran Shafiq Ahmad
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