Rangding Wang

124 papers A* 2B 2C 24Misc 1Journal 73Unranked 22
YearRankTypeTitle / Venue / Authors
2026 J jnl
Expert Syst. Appl.
Site Wu, Zhe Ye, Yuheng Huang, Wenjie Zhang, Rangding Wang, Diqun Yan
2026 J jnl
IEEE Trans. Inf. Forensics Secur.
Qianli Ma, Wenjie Zhang, Jiahao Chen, Jiazhen Jia, Rangding Wang, Diqun Yan
2026 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Lin Yang, Dawen Xu, Jiangbo Qian, Rangding Wang, Songhan He
2026 J jnl
Signal Image Video Process.
Site Wu, Yawei Cheng, Rangding Wang, Diqun Yan
2025 C conf
ISCAS
Linghong Wan, Li Dong, Diqun Yan, Rangding Wang
2025 conf
NPC (2)
Diqun Yan, Rangding Wang
2025 J jnl
IEEE Trans. Multim.
Haojun Dai, Dawen Xu, Lin Yang, Rangding Wang
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
JiaLe Chen, Li Dong, Wei Wang, Rangding Wang, Weiwei Sun, Yushu Zhang, Jiantao Zhou
2024 J jnl
Signal Image Video Process.
Peiwen Zhuo, Diqun Yan, Kaiyu Ying, Rangding Wang, Li Dong
2024 J jnl
IEEE Trans. Multim.
Lin Yang, Rangding Wang, Dawen Xu, Li Dong, Songhan He
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Haojun Dai, Rangding Wang, Dawen Xu, Songhan He, Lin Yang
2024 J jnl
IEEE Signal Process. Lett.
JiaLe Chen, Li Dong, Rangding Wang, Diqun Yan, Chengbin Peng
2024 conf
APSIPA
Sifan Wu, Li Dong, Diqun Yan, Rangding Wang
2024 J jnl
IEEE Trans. Multim.
Lin Yang, Dawen Xu, Jiangbo Qian, Rangding Wang
2024 J jnl
IEEE Trans. Consumer Electron.
Li Dong, Weipeng Liang, Rangding Wang
2023 J jnl
J. Inf. Secur. Appl.
Lin Yang, Dawen Xu, Rangding Wang, Songhan He
2023 J jnl
Comput. Syst. Sci. Eng.
Mingyu Dong, Diqun Yan, Rangding Wang
2023 B conf
IJCNN
Xiaojian Ji, Li Dong, Rangding Wang, Diqun Yan, Yang Yin, Jinyu Tian
2023 J jnl
Multim. Tools Appl.
Lang Chen, Rangding Wang, Li Dong, Diqun Yan
2023 conf
AMC-SME
JiaLe Chen, Xiaojian Ji, Li Dong, Rangding Wang, Diqun Yan, Jinyu Tian
2023 A* conf
ACM Multimedia
Jiacheng Deng, Li Dong, Jiahao Chen, Diqun Yan, Rangding Wang, Dengpan Ye, Lingchen Zhao, Jinyu Tian
2023 J jnl
CoRR
Jiacheng Deng, Li Dong, Jiahao Chen, Diqun Yan, Rangding Wang, Dengpan Ye, Lingchen Zhao, Jinyu Tian
2022 J jnl
CoRR
Mingyu Dong, Diqun Yan, Rangding Wang
2022 J jnl
IEEE Signal Process. Lett.
Jiacheng Deng, Li Dong, Rangding Wang, Rui Yang, Diqun Yan
2022 J jnl
CoRR
Mingyu Dong, Jiahao Chen, Diqun Yan, Jingxing Gao, Li Dong, Rangding Wang
2022 C conf
IWDW
Lin Yang, Rangding Wang, Dawen Xu, Li Dong, Songhan He, Fang Liu
2022 C conf
IWDW
JiaLe Chen, Li Dong, Rangding Wang, Diqun Yan, Weiwei Sun, Hang-Yu Fan
2022 B conf
TrustCom
Weipeng Liang, Li Dong, Rangding Wang, Diqun Yan, Yuanman Li
2022 J jnl
CoRR
Jiacheng Deng, Shunyi Chen, Li Dong, Diqun Yan, Rangding Wang
2021 J jnl
IEEE Access
Kaiyu Ying, Rangding Wang, Yuzhen Lin, Diqun Yan
2021 J jnl
CoRR
Mingyu Dong, Diqun Yan, Yongkang Gong, Rangding Wang
2021 J jnl
KSII Trans. Internet Inf. Syst.
Yongkang Gong, Diqun Yan, Terui Mao, Donghua Wang, Rangding Wang
2021 J jnl
Comput. Commun.
Donghua Wang, Li Dong, Rangding Wang, Diqun Yan
2021 J jnl
Inf.
Tianyun Liu, Diqun Yan, Rangding Wang, Nan Yan, Gang Chen
2021 conf
FCS
Terui Mao, Diqun Yan, Yongkang Gong, Rangding Wang
2021 conf
WIFS
Kaiyu Ying, Rangding Wang, Diqun Yan
2021 J jnl
IEEE Access
Lang Chen, Rangding Wang, Diqun Yan, Jie Wang
2021 J jnl
IEEE Signal Process. Lett.
Yuzhen Lin, Rangding Wang, Li Dong, Diqun Yan, Jie Wang
2021 J jnl
Int. J. Auton. Adapt. Commun. Syst.
Jie Wang, Rangding Wang, Li Dong, Diqun Yan, Xueyuan Zhang, Yuzhen Lin
2020 J jnl
IEEE Access
Heng Yu, Rangding Wang, Li Dong, Diqun Yan, Yongkang Gong, Yuzhen Lin
2020 J jnl
KSII Trans. Internet Inf. Syst.
Lang Lin, Rangding Wang, Diqun Yan, Li Dong
2020 conf
SPDE
Donghua Wang, Rangding Wang, Li Dong, Diqun Yan, Xueyuan Zhang, Yongkang Gong
2020 J jnl
Secur. Commun. Networks
Diqun Yan, Xiaowen Li, Li Dong, Rangding Wang
2020 J jnl
Int. J. Digit. Crime Forensics
Biaoli Tao, Rangding Wang, Diqun Yan, Chao Jin
2020 C conf
IWDW
Donghua Wang, Rangding Wang, Li Dong, Diqun Yan, Yiming Ren
2020 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Li Dong, Jiantao Zhou, Weiwei Sun, Diqun Yan, Rangding Wang
2020 J jnl
Int. J. Digit. Multim. Broadcast.
Yongchao Ye, Lingjie Lao, Diqun Yan, Rangding Wang
2020 conf
SPDE
Xueyuan Zhang, Rangding Wang, Li Dong, Diqun Yan
2020 conf
SPDE
Jie Wang, Rangding Wang, Li Dong, Diqun Yan
2020 J jnl
IEEE Access
Xueyuan Zhang, Rangding Wang, Diqun Yan, Li Dong, Yuzhen Lin
2020 J jnl
IEEE Access
Donghua Wang, Li Dong, Rangding Wang, Diqun Yan, Jie Wang
2020 conf
ICC
Xueyuan Zhang, Rangding Wang, Li Dong, Diqun Yan, Yuzhen Lin, Jie Wang
2019 J jnl
IEEE Access
Xiaowen Li, Diqun Yan, Li Dong, Rangding Wang
2019 C conf
IH&MMSec
Yuzhen Lin, Rangding Wang, Diqun Yan, Li Dong, Xueyuan Zhang
2019 J jnl
Autom. Control. Comput. Sci.
Diqun Yan, Li Xiang, Zhifeng Wang, Rangding Wang
2019 J jnl
IET Inf. Secur.
Qian Li, Rangding Wang, Dawen Xu
2019 J jnl
Digit. Investig.
Chao Jin, Rangding Wang, Diqun Yan
2018 conf
IIP
Lang Lin, Rangding Wang, Diqun Yan
2018 conf
ICCCS (6)
Lang Lin, Rangding Wang, Diqun Yan, Can Li
2018 conf
ICCCS (6)
Qijuan Huang, Rangding Wang, Diqun Yan, Jian Zhang
2018 J jnl
Inf.
Qijuan Huang, Rangding Wang, Diqun Yan, Jian Zhang
2018 J jnl
Inf.
Qian Li, Rangding Wang, Dawen Xu
2018 J jnl
KSII Trans. Internet Inf. Syst.
Diqun Yan, Rangding Wang, Jinglei Zhou, Chao Jin, Zhifeng Wang
2018 J jnl
Secur. Commun. Networks
Dawen Xu, Kai Chen, Rangding Wang, Shubing Su
2018 J jnl
Inf.
Tianyun Qin, Rangding Wang, Diqun Yan, Lang Lin
2017 J jnl
J. Electronic Imaging
Rong Zhang, Rangding Wang, Lijun Guo, Baochuan Jiang
2017 J jnl
Multim. Tools Appl.
Chao Jin, Rangding Wang, Diqun Yan
2017 J jnl
J. Vis. Commun. Image Represent.
Dawen Xu, Rangding Wang, Yani Zhu
2016 conf
ICCCS (1)
Qi Sheng, Rangding Wang, Anshan Pei, Bin Wang
2016 J jnl
Multim. Tools Appl.
Chao Jin, Rangding Wang, Diqun Yan, Pengfei Ma, Jinglei Zhou
2016 J jnl
J. Vis. Commun. Image Represent.
Dawen Xu, Rangding Wang, Yun Q. Shi
2016 conf
ICCCS (2)
Biaoli Tao, Rangding Wang, Diqun Yan, Chao Jin, Yanan Chen, Li Zhang
2016 J jnl
Signal Process.
Dawen Xu, Rangding Wang
2016 C conf
IWDW
Chao Jin, Rangding Wang, Diqun Yan, Biaoli Tao, Yanan Chen, Anshan Pei
2016 C conf
IWDW
Dawen Xu, Yani Zhu, Rangding Wang, Jianjing Fu, Kai Chen
2016 J jnl
Signal Process. Image Commun.
Dawen Xu, Rangding Wang
2015 J jnl
J. Softw.
Jiaji Wang, Rangding Wang, Dawen Xu, Wei Li
2015 C conf
IWDW
Dawen Xu, Kai Chen, Rangding Wang, Shubing Su
2015 J jnl
J. Electronic Imaging
Dawen Xu, Rangding Wang
2015 C conf
IWDW
Meiling Huang, Rangding Wang, Jian Xu, Dawen Xu, Qian Li
2015 J jnl
Multim. Tools Appl.
Rong Zhang, Rangding Wang
2015 C conf
IWDW
Jinglei Zhou, Rangding Wang, Chao Jin, Diqun Yan
2014 J jnl
Int. J. Comput. Intell. Syst.
Rangding Wang, Qian Li, Chao Jin, Juan Li, Yiqun Xiong
2014 J jnl
Multim. Tools Appl.
Juan Li, Rangding Wang, Diqun Yan, Youming Li
2014 conf
ChinaSIP
Chao Jin, Rangding Wang, Diqun Yan, Pengfei Ma, Kaiyun Yang
2014 A* conf
CVPR
Shaojing Fan, Tian-Tsong Ng, Jonathan S. Herberg, Bryan L. Koenig, Cheston Yin Chet Tan, Rangding Wang
2014 J jnl
J. Vis. Commun. Image Represent.
Dawen Xu, Rangding Wang, Yun Q. Shi
2014 J jnl
IEEE Trans. Inf. Forensics Secur.
Dawen Xu, Rangding Wang, Yun Q. Shi
2014 J jnl
J. Softw.
Xianmin Yu, Rangding Wang, Diqun Yan, Pengfei Ma
2014 C conf
IWDW
Jinglei Zhou, Rangding Wang, Chao Jin, Diqun Yan
2014 J jnl
J. Softw.
Pengfei Ma, Rangding Wang, Diqun Yan, Chao Jin
2014 J jnl
Multim. Tools Appl.
Diqun Yan, Rangding Wang
2014 J jnl
J. Electronic Imaging
Dawen Xu, Rangding Wang
2014 J jnl
ACM Trans. Appl. Percept.
Shaojing Fan, Rangding Wang, Tian-Tsong Ng, Cheston Yin Chet Tan, Jonathan S. Herberg, Bryan L. Koenig
2014 C conf
IWDW
Dawen Xu, Rangding Wang
2013 C conf
IWDW
Pengfei Ma, Rangding Wang, Diqun Yan, Chao Jin
2013 J jnl
J. Softw.
Xianmin Yu, Rangding Wang, Diqun Yan
2013 C conf
IWDW
Dawen Xu, Rangding Wang, Yun-Qing Shi
2013 J jnl
Digit. Signal Process.
Diqun Yan, Rangding Wang, Xianmin Yu, Jie Zhu
2013 J jnl
J. Comput.
Qian Li, Rangding Wang
2012 J jnl
Wirel. Pers. Commun.
Ming Jin, Youming Li, Zhenghao Zhang, Rangding Wang
2012 J jnl
J. Real Time Image Process.
Dawen Xu, Rangding Wang, Jicheng Wang
2012 J jnl
Comput. Secur.
Diqun Yan, Rangding Wang, Xianmin Yu, Jie Zhu
2011 J jnl
Signal Process. Image Commun.
Dawen Xu, Rangding Wang, Jicheng Wang
2011 C conf
IWDW
Rong Zhang, Rangding Wang, Tian-Tsong Ng
2011 J jnl
Multim. Tools Appl.
Diqun Yan, Rangding Wang
2010 Misc conf
ISKE
Rangding Wang, Yiqun Xiong
2010 conf
WCNIS
Dawen Xu, Rangding Wang, Jicheng Wang
2010 conf
GreenCom/CPSCom
Shoudong Shi, Rangding Wang, Jiangbo Qian
2009 conf
ITNG
Yiqun Xiong, Rangding Wang
2009 C conf
IWDW
Dawen Xu, Rangding Wang, Jicheng Wang
2009 J jnl
Fundam. Informaticae
Diqun Yan, Rangding Wang, Liguang Zhang
2008 C conf
CW
Yigiun Xiong, Rangding Wang
2008 conf
ICYCS
Jiangbo Qian, Rangding Wang, Guang Jin, Yuan Li
2008 C conf
CW
Yuanyuan Hu, Rangding Wang
2008 conf
IIH-MSP
Diqun Yan, Rangding Wang
2008 C conf
CW
Jiaqiang Tan, Rangding Wang
2008 C conf
IWDW
Dawen Xu, Rangding Wang, Jicheng Wang
2007 C conf
IWDW
Rangding Wang, Wenji Hu
2005 C conf
PDCAT
Rangding Wang, Dawen Xu, Qian Li
2005 conf
CIS (2)
Gangyi Jiang, Liangzhong Fan, Mei Yu, Rangding Wang, Xien Ye, Yong-Deak Kim
2005 conf
PCM (1)
Gangyi Jiang, Liangzhong Fan, Mei Yu, Xien Ye, Rangding Wang, Yong-Deak Kim
2005 C conf
PDCAT
Mei Yu, Xien Ye, Rangding Wang, Fangming Xiao, Gangyi Jiang
2005 C conf
PDCAT
Liangzhong Fan, Mei Yu, Gangyi Jiang, Rangding Wang, Yong-Deak Kim
tests/conftest.py
← Index tests/conftest.py python
"""
Pytest configuration and shared fixtures for REDB unit tests.
"""
import os
import sys
import pytest
import logging
import tempfile
import hashlib
from unittest.mock import Mock, MagicMock, patch
from pathlib import Path

# Add the project root to the path
sys.path.insert(0, str(Path(__file__).parent.parent))

# Test files directory
TEST_FILES_DIR = Path(__file__).parent.parent / "test_files"


# ============================================================================
# Logger Fixtures
# ============================================================================

@pytest.fixture
def mock_logger():
    """Create a mock logger for testing."""
    logger = Mock()
    logger.debug = Mock()
    logger.info = Mock()
    logger.warning = Mock()
    logger.error = Mock()
    return logger


@pytest.fixture
def real_logger():
    """Create a real logger for testing with debug output."""
    logger = logging.getLogger("test_logger")
    logger.setLevel(logging.DEBUG)
    if not logger.handlers:
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    return logger


# ============================================================================
# Test Binary Files Fixtures
# ============================================================================

@pytest.fixture
def elf_binary_path():
    """Path to the ELF test binary."""
    path = TEST_FILES_DIR / "hello"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def elf_advanced_binary_path():
    """Path to the advanced ELF test binary."""
    path = TEST_FILES_DIR / "hello_advanced"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def pe_binary_path():
    """Path to the PE test binary (.NET PE)."""
    path = TEST_FILES_DIR / "d8637bdbcfc9112fcb1f0167b398e771"
    if not path.exists():
        pytest.skip(f"Test file not found: {path}")
    return str(path)


@pytest.fixture
def elf_binary_content(elf_binary_path):
    """Read the ELF test binary content."""
    with open(elf_binary_path, "rb") as f:
        return f.read()


@pytest.fixture
def pe_binary_content(pe_binary_path):
    """Read the PE test binary content."""
    with open(pe_binary_path, "rb") as f:
        return f.read()


# ============================================================================
# Temporary Files Fixtures
# ============================================================================

@pytest.fixture
def temp_binary_file():
    """Create a temporary binary file for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".bin") as f:
        # Write some test data
        f.write(b"\x7fELF" + b"\x00" * 100 + b"test data")
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


@pytest.fixture
def temp_text_file():
    """Create a temporary text file for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="w") as f:
        f.write("This is a test file with some text content.")
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


@pytest.fixture
def temp_pe_like_file():
    """Create a temporary file with PE-like header for testing."""
    with tempfile.NamedTemporaryFile(delete=False, suffix=".exe") as f:
        # MZ header
        f.write(b"MZ" + b"\x00" * 58)
        # e_lfanew pointing to PE header at offset 64
        f.write(b"\x40\x00\x00\x00")
        # PE signature at offset 64
        f.write(b"PE\x00\x00")
        # Minimal COFF header (20 bytes)
        f.write(b"\x4c\x01")  # Machine (i386)
        f.write(b"\x01\x00")  # NumberOfSections
        f.write(b"\x00" * 16)  # Rest of COFF header
        temp_path = f.name

    yield temp_path

    # Cleanup
    if os.path.exists(temp_path):
        os.unlink(temp_path)


# ============================================================================
# Mock Exporter Fixtures
# ============================================================================

@pytest.fixture
def mock_print_exporter(mock_logger):
    """Create a mock PrintExporter."""
    from redb.extractors.database_exporters import PrintExporter
    exporter = PrintExporter(mock_logger, "test_index")
    return exporter


@pytest.fixture
def mock_elasticsearch_exporter(mock_logger):
    """Create a mock ElasticsearchExporter with mocked client."""
    with patch('redb.settings.get_elasticsearch_client') as mock_client:
        mock_client.return_value = Mock()
        from redb.extractors.database_exporters import ElasticsearchExporter
        exporter = ElasticsearchExporter(mock_logger, "test_index")
        return exporter


@pytest.fixture
def mock_clickhouse_exporter(mock_logger):
    """Create a mock ClickHouseExporter with mocked client."""
    with patch('redb.settings.create_clickhouse_client') as mock_client:
        mock_client.return_value = Mock()
        from redb.extractors.database_exporters import ClickHouseExporter
        exporter = ClickHouseExporter(mock_logger, "test_index", client=Mock())
        return exporter


# ============================================================================
# Mock Settings Fixtures
# ============================================================================

@pytest.fixture
def mock_settings():
    """Mock the redb.settings module."""
    with patch.multiple(
        'redb.settings',
        ELASTIC_BINARIES_COLLECTION="test_collection",
        get_elasticsearch_client=Mock(return_value=Mock()),
        create_clickhouse_client=Mock(return_value=Mock()),
    ):
        yield


# ============================================================================
# Hash Fixtures
# ============================================================================

@pytest.fixture
def known_hashes(elf_binary_content):
    """Compute known hashes for the ELF test binary."""
    return {
        'md5': hashlib.md5(elf_binary_content).hexdigest(),
        'sha1': hashlib.sha1(elf_binary_content).hexdigest(),
        'sha256': hashlib.sha256(elf_binary_content).hexdigest(),
    }


@pytest.fixture
def pe_known_hashes(pe_binary_content):
    """Compute known hashes for the PE test binary."""
    return {
        'md5': hashlib.md5(pe_binary_content).hexdigest(),
        'sha1': hashlib.sha1(pe_binary_content).hexdigest(),
        'sha256': hashlib.sha256(pe_binary_content).hexdigest(),
    }


# ============================================================================
# Sample Data Fixtures
# ============================================================================

@pytest.fixture
def sample_binary_data():
    """Sample binary data for entropy and hash testing."""
    return b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" * 16


@pytest.fixture
def high_entropy_data():
    """High entropy random-like data for testing."""
    import random
    random.seed(42)  # Reproducible
    return bytes(random.randint(0, 255) for _ in range(256))


@pytest.fixture
def low_entropy_data():
    """Low entropy repetitive data for testing."""
    return b"\x00" * 256


# ============================================================================
# PE Object Fixtures
# ============================================================================

@pytest.fixture
def pe_object(pe_binary_path):
    """Create a pefile PE object for testing."""
    import pefile
    try:
        pe = pefile.PE(pe_binary_path)
        yield pe
        pe.close()
    except Exception as e:
        pytest.skip(f"Failed to parse PE file: {e}")


# ============================================================================
# ELF Object Fixtures
# ============================================================================

@pytest.fixture
def elf_object(elf_binary_path):
    """Create an ELFFile object for testing."""
    from elftools.elf.elffile import ELFFile
    try:
        with open(elf_binary_path, 'rb') as f:
            elf = ELFFile(f)
            # We need to keep the file open for ELFFile to work
            yield elf
    except Exception as e:
        pytest.skip(f"Failed to parse ELF file: {e}")


# ============================================================================
# Dataclass Fixtures
# ============================================================================

@pytest.fixture
def sample_hash_dataclass():
    """Create a sample Hash dataclass."""
    from redb.models.dataclasses import Hash
    return Hash(
        md5="d41d8cd98f00b204e9800998ecf8427e",
        sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
        sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    )


@pytest.fixture
def sample_hashes_dataclass():
    """Create a sample Hashes dataclass."""
    from redb.models.dataclasses import Hashes
    return Hashes(
        md5="d41d8cd98f00b204e9800998ecf8427e",
        sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
        sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        ssdeep_hash="3::",
        tlsh_hash=""
    )


@pytest.fixture
def sample_basic_properties():
    """Create a sample BasicProperties dataclass."""
    from redb.models.dataclasses import BasicProperties
    return BasicProperties(
        filename="test.exe",
        sample_name="test.exe",
        filesize=1024,
        filetype="PE32 executable",
        filetype_mime="application/x-dosexec",
        filetype_magika="pebin",
        file_entropy=6.5
    )


# ============================================================================
# Utility Functions for Tests
# ============================================================================

def compute_entropy(data):
    """Compute entropy of data for verification in tests."""
    import math
    from collections import Counter

    if not data:
        return 0.0

    if isinstance(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:
        occurrences = Counter(bytearray(data))
        entropy = 0
        for x in occurrences.values():
            p_x = float(x) / len(data)
            entropy -= p_x * math.log(p_x, 2)
        return entropy


# Make the function available as a fixture
@pytest.fixture
def entropy_calculator():
    """Return the entropy calculation function."""
    return compute_entropy


# ============================================================================
# Skip Markers
# ============================================================================

# Mark tests that require external tools
requires_die = pytest.mark.skipif(
    not os.path.exists("/usr/bin/diec") and not os.path.exists("/usr/local/bin/diec"),
    reason="Detect It Easy (diec) not installed"
)

requires_capa = pytest.mark.skipif(
    not os.path.exists("/usr/bin/capa") and not os.path.exists("/usr/local/bin/capa"),
    reason="capa not installed"
)

requires_floss = pytest.mark.skipif(
    not os.path.exists("/usr/bin/floss") and not os.path.exists("/usr/local/bin/floss"),
    reason="floss not installed"
)