Xianping Guo

65 papers Journal 63Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans Autom. Sci. Eng.
Gaochen Cui, Qing-Shan Jia, Xiaohong Guan, Qiaozhu Zhai, Xianping Guo, Qi Guo
2026 J jnl
Discret. Event Dyn. Syst.
Weicheng Wang, Wenbo Zeng, Xianping Guo
2025 J jnl
Autom.
Junyu Zhang, Xianping Guo, Li Xia
2024 J jnl
Oper. Res. Lett.
Xin Wen, Xianping Guo, Li Xia
2023 J jnl
Autom.
Li Xia, Xianping Guo, Xi-Ren Cao
2023 J jnl
IEEE Trans. Autom. Control.
Xiangxiang Huang, Xianping Guo, Xin Wen
2023 J jnl
Math. Methods Oper. Res.
Yonghui Huang, Zhaotong Lian, Xianping Guo
2022 J jnl
J. Optim. Theory Appl.
Fang Chen, Xianping Guo, Zhong-Wei Liao
2022 J jnl
Oper. Res.
Yonghui Huang, Zhaotong Lian, Xianping Guo
2022 J jnl
Discret. Event Dyn. Syst.
Zhihui Yu, Xianping Guo, Li Xia
2021 J jnl
CoRR
Zhihui Yu, Xianping Guo, Li Xia
2021 J jnl
CoRR
Junyu Zhang, Xianping Guo, Li Xia
2020 J jnl
Math. Oper. Res.
Yonghui Huang, Xianping Guo
2020 J jnl
Dyn. Games Appl.
Xiangxiang Huang, Xianping Guo
2020 J jnl
IEEE Trans. Autom. Control.
Haifeng Huo, Xianping Guo
2020 J jnl
Oper. Res. Lett.
Yonghui Huang, Zhaotong Lian, Xianping Guo
2019 J jnl
IEEE Trans. Autom. Control.
Xiangxiang Huang, Qiuli Liu, Xianping Guo
2019 J jnl
J. Optim. Theory Appl.
Zhongyang Sun, Xianping Guo
2019 J jnl
SIAM J. Control. Optim.
Xianping Guo, Zhong-Wei Liao
2019 J jnl
Discret. Event Dyn. Syst.
Xianping Guo, Junyu Zhang
2017 J jnl
J. Optim. Theory Appl.
Xianggang Lu, George Yin, Xianping Guo
2017 J jnl
Discret. Event Dyn. Syst.
Haifeng Huo, Xiaolong Zou, Xianping Guo
2016 J jnl
SIAM J. Optim.
Yonghui Huang, Xianping Guo
2016 J jnl
Math. Oper. Res.
Xianping Guo, Yi Zhang
2015 J jnl
Kybernetika
Xiaolong Zou, Xianping Guo
2015 J jnl
J. Appl. Probab.
Xiao Wu, Xianping Guo
2015 J jnl
SIAM J. Control. Optim.
Xianping Guo, Xiangxiang Huang, Yi Zhang
2015 J jnl
4OR
Qingda Wei, Xianping Guo
2014 J jnl
Comput. Educ.
Jun Tan, Xianping Guo, Wei-Shi Zheng, Ming Zhong
2014 J jnl
Oper. Res. Lett.
Yonghui Huang, Zhongfei Li, Xianping Guo
2014 J jnl
Eur. J. Oper. Res.
Xianping Guo, Wenzhao Zhang
2014 J jnl
IEEE Trans. Autom. Control.
Xianping Guo, Xinyuan Song, Yi Zhang
2014 J jnl
J. Syst. Sci. Complex.
Quanxin Zhu, Xianping Guo
2013 J jnl
Ann. Oper. Res.
Yonghui Huang, Qingda Wei, Xianping Guo
2012 J jnl
Eur. J. Oper. Res.
Xianping Guo, Liuer Ye, George Yin
2012 J jnl
Int. J. Syst. Sci.
Qiuli Liu, HangSheng Tan, Xianping Guo
2012 J jnl
Eur. J. Control
Xianping Guo, Adrián Hernández-del-Valle, Onésimo Hernández-Lerma
2012 J jnl
SIAM J. Control. Optim.
Xianping Guo, Yonghui Huang, Xinyuan Song
2012 J jnl
J. Optim. Theory Appl.
Qingda Wei, Xianping Guo
2011 conf
BIBM Workshops
Jianxiong Cai, Yuanqi Zhao, Xianping Guo, Min Zhao, Yubo Lu, Ruizhi Zhao, Yefeng Cai, Darong Wu
2011 J jnl
Math. Oper. Res.
Xianping Guo, Alexei B. Piunovskiy
2011 J jnl
Eur. J. Oper. Res.
Yonghui Huang, Xianping Guo
2011 J jnl
Oper. Res. Lett.
Qingda Wei, Xianping Guo
2011 J jnl
Syst. Control. Lett.
Xianping Guo, Adrián Hernández-del-Valle, Onésimo Hernández-Lerma
2011 J jnl
J. Optim. Theory Appl.
Yonghui Huang, Xianping Guo, Xinyuan Song
2011 J jnl
J. Syst. Sci. Complex.
Xianping Guo, Lanlan Zhang
2010 J jnl
Math. Methods Oper. Res.
Liuer Ye, Xianping Guo
2010 J jnl
Int. J. Control
Xianping Guo, Adrián Hernández-del-Valle, Onésimo Hernández-Lerma
2009 J jnl
Oper. Res. Lett.
Xianping Guo, Xinyuan Song, Junyu Zhang
2009 J jnl
IEEE Trans. Autom. Control.
Xianping Guo, Xinyuan Song
2008 J jnl
Math. Methods Oper. Res.
Lanlan Zhang, Xianping Guo
2007 J jnl
IEEE Trans. Autom. Control.
Xianping Guo
2007 J jnl
Math. Oper. Res.
Xianping Guo
2007 J jnl
IEEE Trans. Autom. Control.
Xi-Ren Cao, Xianping Guo
2005 J jnl
SIAM J. Control. Optim.
Xianping Guo, Xi-Ren Cao
2005 J jnl
Math. Methods Oper. Res.
Quanxin Zhu, Xianping Guo, Yonglong Dai
2004 J jnl
Autom.
Xi-Ren Cao, Xianping Guo
2004 conf
CDC
Xi-Ren Cao, Xianping Guo
2003 J jnl
IEEE Trans. Autom. Control.
Xianping Guo, Onésimo Hernández-Lerma
2002 J jnl
Autom.
Xianping Guo, Wen Yu, Xiaoou Li
2001 J jnl
IEEE Trans. Autom. Control.
Xianping Guo, Ke Liu
2001 J jnl
SIAM J. Optim.
Xianping Guo, Peng Shi
2000 J jnl
Math. Methods Oper. Res.
Xianping Guo, Peng Shi, Weiping Zhu
2000 J jnl
Math. Oper. Res.
Xianping Guo, Jianyong Liu, Ke Liu
1999 J jnl
Math. Methods Oper. Res.
Xianping Guo
redb/extractors/extractor.py
← Index redb/extractors/extractor.py python
import hashlib
import inspect
from abc import ABCMeta, abstractmethod
from dataclasses import asdict
from functools import cached_property
from datetime import datetime, timezone
import math
from typing import Counter, List, Optional, Dict, Any, Tuple
from redb import settings
from redb.models.dataclasses import Hash
from .database_exporters import DatabaseExporter, ElasticsearchExporter, ClickHouseExporter, PrintExporter

class Extractor(metaclass=ABCMeta):
    def __init__(
        self,
        filepath: str,
        log: Any,
        exporters: Optional[List[DatabaseExporter]] = None,
        index_prefix: Optional[str] = None,
        source: Optional[str] = None,
        elastic_index: Optional[str] = None,
        known_benign: bool = False,
        known_malicious: bool = False,
        precomputed_hashes: Optional[Dict[str, str]] = None,
    ):
        self.log = log
        self.log.debug(f"Creating {self.__class__.__name__}")
        self.filepath = filepath
        self.source = source
        self.exporters = exporters or []
        self.index_prefix = index_prefix if index_prefix else settings.ELASTIC_BINARIES_COLLECTION
        self.elastic_index = self.index_prefix + (elastic_index if elastic_index else "")
        self.known_benign = known_benign
        self.known_malicious = known_malicious

        # Use precomputed hashes if provided (e.g., from machofile, pefile)
        # Otherwise compute them from binary
        if precomputed_hashes:
            self.md5 = precomputed_hashes.get('md5') or precomputed_hashes.get('MD5')
            self.sha1 = precomputed_hashes.get('sha1') or precomputed_hashes.get('SHA1')
            self.sha256 = precomputed_hashes.get('sha256') or precomputed_hashes.get('SHA256')
        else:
            self.md5 = hashlib.md5(self.binary).hexdigest()
            self.sha1 = hashlib.sha1(self.binary).hexdigest()
            self.sha256 = hashlib.sha256(self.binary).hexdigest()
        self.hash = Hash(self.md5, self.sha1, self.sha256)

    @cached_property
    def binary(self):
        with open(self.filepath, "rb") as f:
            data = f.read()
        return data

    @property
    @abstractmethod
    def tag(self):
        pass

    @abstractmethod
    def extract(self):
        """
        this method defines the extracted data
        """

    @staticmethod
    def process_binary_string(s):
        # Remove \x00 padding
        s = s.rstrip(b"\x00")

        # Check if there are any non-printable characters
        has_non_printable = any(byte < 32 or byte > 126 for byte in s)

        if not has_non_printable:
            # If all characters are printable, decode the string
            return s.decode()
        else:
            # If there are non-printable characters, represent them as \xDD
            return "".join(
                [
                    f"\\x{byte:02x}" if byte < 32 or byte > 126 else chr(byte)
                    for byte in s
                ]
            )

    @staticmethod
    def remove_non_utf8(binary_string):
        decoded = b""
        for i in range(len(binary_string)):
            try:
                # Try to decode each byte
                char = binary_string[i : i + 1].decode("utf-8")
                decoded += char.encode("utf-8")
            except UnicodeDecodeError:
                # Skip this byte if it can't be decoded
                continue
        return decoded

    def calculate_entropy(self, data):
        """Calculate the entropy of a chunk of data.
        Based on pefile.SectionStructure.entropy_H.
        """
        # self.log.debug(inspect.currentframe().f_code.co_name)
        if not data:
            return 0.0

        if type(data) == str:
            counts = Counter(data)
            frequencies = ((i / len(data)) for i in counts.values())
            return - sum(f * math.log(f, 2) for f in frequencies)
        else:
            occurences = Counter(bytearray(data))
            entropy = 0
            for x in occurences.values():
                p_x = float(x) / len(data)
                entropy -= p_x * math.log(p_x, 2)
            return entropy

    @abstractmethod
    def prepare_export_data(self, exporter_type: str) -> Tuple[List[Any], List[str], List[str]]:
        """
        Prepare data for specific export type
        Returns:
            Tuple containing:
            - data: List of values to insert
            - column_names: List of column names
            - column_type_names: List of column types
        """
        pass

    def export_data(self):
        """Export data to all configured exporters

        Returns:
            True: Export succeeded
            False: Export failed (actual error)
            None: No data to export (not an error, e.g., no overlay, no signature)
        """
        self.log.debug(inspect.currentframe().f_code.co_name)
        success = True
        extracted_data = self.extract()

        if extracted_data is None:
            self.log.debug("extract() returned None, skipping export")
            return None  # No data to export, not a failure
            
        for exporter in self.exporters:
            if isinstance(exporter, PrintExporter):
                # For PrintExporter, we pass the extracted data directly
                success &= exporter.export(extracted_data)
            else:
                # Get the data prepared for this specific exporter type
                export_data = self.prepare_export_data(exporter.__class__.__name__)
                
                if export_data is None:
                    self.log.debug(f"prepare_export_data returned None for {exporter.__class__.__name__}")
                    return False
                
                if isinstance(exporter, ElasticsearchExporter):
                    success &= exporter.export(
                        export_data,
                        index=self.elastic_index,
                        tag=self.tag(),
                        hashes=asdict(self.hash),
                        known_benign=self.known_benign,
                        known_malicious=self.known_malicious
                    )
                elif isinstance(exporter, ClickHouseExporter):
                    # For ClickHouse, we need to pass the table name and the prepared data
                    success &= exporter.export(
                        export_data,
                        table=self.get_clickhouse_table(),
                        # Add these parameters explicitly
                        column_names=export_data[1] if isinstance(export_data, tuple) else None,
                        column_type_names=export_data[2] if isinstance(export_data, tuple) else None
                    )
                
        return success

    @abstractmethod
    def get_clickhouse_table(self) -> str:
        """Return the appropriate ClickHouse table name"""
        pass
    # def export_to_elastic(self, list_of_dataclasses, tag=None):
    #     self.log.debug(inspect.currentframe().f_code.co_name)

    #     if not isinstance(list_of_dataclasses, list):
    #         self.log.error("Called export_to_elastic wrongly")

    #     now_t = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
    #     for dataclass_ in list_of_dataclasses:
    #         if not settings.ELASTIC_CLIENT.ping():
    #             self.log.error("[CONNECTION ERROR] ping to elastic failed")
            
    #         # Convert dataclass to dict and filter out None values
    #         document = {k: v for k, v in asdict(dataclass_).items() if v is not None}
            
    #         if tag:
    #             document["tag"] = [tag, self.tag()]
    #         else:
    #             document["tag"] = self.tag()
    #         hashes = asdict(self.hash)
    #         document |= hashes
    #         document["timestamp_utc"] = now_t
    #         # document["source"] = self.source
    #         document["known_benign"] = self.known_benign
    #         document["known_malicious"] = self.known_malicious

    #         if "_id" in document:
    #             tmp_id = document.pop("_id") + document["sha256"]
    #             _id = hashlib.sha256(tmp_id.encode()).hexdigest()
    #         else:
    #             _id = document["sha256"]

    #         # self.log.debug(f"[DEBUG] about to export {type(document)} {document}")
    #         try:
    #             doc_dump = json.dumps(document)
    #         except TypeError as e:
    #             self.log.error(
    #                 f"Failed export of document. " f"full document: {document}"
    #             )
    #             raise e

    #         # body={"doc": doc_dump,
    #         #       "doc_as_upsert": True  # Create the document if it doesn't exist
    #         # }

    #         # Check if the index exists, and create it if it doesn't
    #         # if not settings.ELASTIC_CLIENT.indices.exists(index=self.elastic_index):
    #         #     settings.ELASTIC_CLIENT.indices.create(index=self.elastic_index)
    #         # pprint(doc_dump) #DEBUG
    #         # print("[DEBUG] _id: " + _id)
    #         # print("[DEBUG] index: " + self.elastic_index)
    #         settings.ELASTIC_CLIENT.index(
    #             index=self.elastic_index, id=_id, document=doc_dump
    #         )