Hai Zhong

32 papers A 1B 1C 1Journal 24Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
BMC Medical Imaging
Chao Zhang, Hai Zhong, Mengmeng Zhao, Yadong Li, Zhengjun Dai, Guodong Pang
2026 J jnl
CoRR
Zhuoran Li, Hai Zhong, Xun Wang, Qingxin Xia, Lihua Zhang, Longbo Huang
2026 J jnl
CoRR
Hai Zhong, Zhuoran Li, Xun Wang, Longbo Huang
2026 J jnl
Veh. Commun.
Mingfeng Huang, Peng Wang, Athanasios V. Vasilakos, Hai Zhong
2025 C conf
CSCWD
Yingxian Zhang, Yushui Geng, Hu Liang, Hai Zhong
2025 J jnl
BMC Medical Imaging
Linlin Meng, Xiaolin Wu, Kai Su, Hai Zhong
2025 J jnl
CoRR
Xun Wang, Zhuoran Li, Hai Zhong, Longbo Huang
2025 J jnl
CoRR
Xun Wang, Zhuoran Li, Yanshan Lin, Hai Zhong, Longbo Huang
2025 J jnl
CoRR
Zhuoran Li, Xun Wang, Hai Zhong, Longbo Huang
2025 J jnl
CoRR
Zhuoran Li, Ruishuo Chen, Hai Zhong, Longbo Huang
2025 A conf
AAMAS
Hai Zhong, Xun Wang, Zhuoran Li, Longbo Huang
2025 B conf
IJCNN
Hai Zhong, Wenhao Wang, Jin Zhang
2025 J jnl
Briefings Bioinform.
Zhimin Li, Wenlan Chen, Hai Zhong, Cheng Liang
2025 J jnl
CoRR
Hai Zhong, Xun Wang, Zhuoran Li, Longbo Huang
2025 J jnl
CoRR
Chen Qian, Haoyu Zhang, Junnan Ma, Liuhong Zhu, Qingrui Cai, Yu Wang, Ruibo Song, Lv Li, Lin Mei, Xianwang Jiang, Qin Xu, Boyu Jiang, Ran Tao, Chunmiao Chen, Shufang Chen, Dongyun Liang, Qiu Guo, Jianzhong Lin, Taishan Kang, Mengtian Lu, Liyuan Fu, Ruibin Huang, Huijuan Wan, Xu Huang, Jianhua Wang, Di Guo, Hai Zhong, Jianjun Zhou, Xiaobo Qu
2025 J jnl
CoRR
Zetong Chen, Yuzhuo Chen, Hai Zhong, Xu Qiao
2024 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Yuan Xie, Hai Zhong, JiaQi Wu, Wangyuan Zhao, Runping Hou, Lu Zhao, Xiaowei Xu, Min Zhang, Jun Zhao
2024 J jnl
CoRR
Hai Zhong, Xun Wang, Zhuoran Li, Longbo Huang
2023 J jnl
IEEE Robotics Autom. Lett.
Hai Zhong, Yutaka Shimizu, Jianyu Chen
2022 J jnl
CoRR
Hai Zhong, Yutaka Shimizu, Jianyu Chen
2021 conf
EMBC
Lu Qiu, Meichang Huang, Xiaowei Xu, Wangyuan Zhao, Lu Zhao, Hai Zhong, Yaling Tang, Jun Zhao
2021 conf
EMBC
Hai Zhong, JiaQi Wu, Wangyuan Zhao, Xiaowei Xu, Runping Hou, Lu Zhao, Ziheng Deng, Min Zhang, Jun Zhao
2021 J jnl
Quantum Inf. Process.
Hai Zhong, Xiaodong Wu, Manyuan Deng, Duan Huang, Sha Xiong, Ying Guo
2020 J jnl
Quantum Inf. Process.
Wei Ye, Hai Zhong, Xiaodong Wu, Liyun Hu, Ying Guo
2020 J jnl
Quantum Inf. Process.
Wei Ye, Ying Guo, Huan Zhang, Hai Zhong, Ying Xia, Shoukang Chang, Liyun Hu
2020 J jnl
Quantum Inf. Process.
Xiaodong Wu, Yijun Wang, Hai Zhong, Wei Ye, Duan Huang, Ying Guo
2019 J jnl
J. Digit. Imaging
Shikun Zhang, Fengrong Sun, Naishun Wang, Cuicui Zhang, Qianlei Yu, Mingqiang Zhang, Paul S. Babyn, Hai Zhong
2019 J jnl
Entropy
Xiaodong Wu, Yijun Wang, Qin Liao, Hai Zhong, Ying Guo
2018 J jnl
Entropy
Hai Zhong, Yijun Wang, Xudong Wang, Qin Liao, Xiaodong Wu, Ying Guo
2010 conf
GCC
Hai Zhong, Zehua Zhang, Xuejie Zhang
2010 conf
ChinaGrid
Hai Zhong, Kun Tao, Xuejie Zhang
2009 conf
FCST
Yanxiang He, Tao Liu, Hai Zhong, Qi Xiong
tests/unit/test_decompile_strings.py
← Index tests/unit/test_decompile_strings.py python
"""Unit tests for bninja/analysis/strings.py — StringAnalysis."""
import pytest
import math
from unittest.mock import MagicMock


# StringAnalysis has no binaryninja imports, just collections and math
from redb.extractors.decompiler.bninja.analysis.strings import StringAnalysis


# ============================================================================
# Helper mocks
# ============================================================================

class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, type_name="Utf8String"):
        self.value = value
        self.raw = raw if raw is not None else (value.encode("utf-8") if isinstance(value, str) else value)
        self.start = start
        self.length = length if length else len(self.raw)
        self.type = MagicMock()
        self.type.name = type_name


class MockBinaryView:
    """Mock binary view with a strings list."""
    def __init__(self, strings=None):
        self.strings = strings or []


# ============================================================================
# 6a. StringAnalysis
# ============================================================================


class TestStringAnalysisEntropy:
    def setup_method(self):
        self.sa = StringAnalysis(bv=MockBinaryView(), functions=[])

    def test_entropy_empty_string(self):
        assert self.sa.entropy("") == 0.0

    def test_entropy_single_char(self):
        assert self.sa.entropy("aaaa") == 0.0

    def test_entropy_uniform_distribution(self):
        # "abcd" -> 4 unique chars, each p=1/4, entropy = log2(4) = 2.0
        result = self.sa.entropy("abcd")
        assert result == pytest.approx(2.0)

    def test_entropy_binary_string(self):
        # "ab" -> 2 unique chars, each p=1/2, entropy = log2(2) = 1.0
        result = self.sa.entropy("ab")
        assert result == pytest.approx(1.0)


class TestStringAnalysisAnalyze:
    def test_analyze_deduplication(self):
        """Duplicate (string, encoding) pairs -> only first kept."""
        entries = [
            MockStringEntry("hello", start=100, type_name="Utf8String"),
            MockStringEntry("hello", start=200, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        assert result[0]["string_offset"] == 100

    def test_analyze_sorted_by_address(self):
        """First occurrence (lowest offset) is the one kept."""
        entries = [
            MockStringEntry("world", start=500, type_name="Utf8String"),
            MockStringEntry("world", start=100, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        # The analyze() sorts by start, so 100 comes first
        assert result[0]["string_offset"] == 100

    def test_analyze_empty_bv(self):
        bv = MockBinaryView(strings=[])
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert result == []

    def test_analyze_output_schema(self):
        entries = [MockStringEntry("test_string", start=0, type_name="Utf8String")]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        r = result[0]
        required_keys = [
            "string",
            "string_raw",
            "string_encoding",
            "string_offset",
            "string_length",
            "string_raw_length",
            "string_entropy",
        ]
        for key in required_keys:
            assert key in r, f"Missing key: {key}"