标签 hex 下的文章

用来生成可用在代码中的,指定长度hex字符脚本。默认为16个字条表示。

import argparse
import secrets

def generate_random_hex_string(length):
    # 生成指定长度的随机字节
    random_bytes = secrets.token_bytes(length)
    
    # 将每个字节转化为以0x开头的十六进制字符串
    hex_string = ','.join(f'0x{byte:02x}' for byte in random_bytes)
    
    return hex_string

def main():
    # 命令行参数解析
    parser = argparse.ArgumentParser(description="生成随机十六进制字节串")
    parser.add_argument('length', type=int, nargs='?', default=16, 
                        help="生成十六进制随机数的长度,默认为16")
    
    args = parser.parse_args()
    
    # 生成随机十六进制字符串
    result = generate_random_hex_string(args.length)
    
    # 输出结果
    print(result)

# 检查是否直接运行该脚本
if __name__ == '__main__':
    main()

需要从文本读入一组二进制数据。希望尽可能多的兼容各种文本形式。比如0x1234567890abcdef或1234567890abcdef或12 34 45 78 90 ab cd ef或12,34,56,78,90,ab,cd,ef或者0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef这样的文本都可以正确的解析成二进制数据,还要需要有无效格式的判断。
以下是C++实现:

std::vector<uint8_t> ParseHexToBytes(std::string_view input)
{
    std::vector<uint8_t> bytes;
    bytes.reserve(1024);

    std::string currentByte;
    currentByte.reserve(2);

    for (size_t i = 0; i < input.size(); ++i)
    {
        char c = std::tolower(input[i]);

        if (c == '0' && i + 1 < input.size() && (input[i + 1] == 'x' || input[i + 1] == 'X'))
        {
            ++i;
            continue;
        }

        if (std::ispunct(c) || std::isblank(c))
        {
            continue;
        }

        if (!std::isxdigit(c))
        {
            return {};
        }

        currentByte += c;

        if (currentByte.size() == 2)
        {
            uint8_t byte = static_cast<uint8_t>(std::stoi(currentByte, nullptr, 16));
            bytes.push_back(byte);
            currentByte.clear();
        }
    }

    return bytes;
}