字节流与十六进制字符串的相互转化

以下是将字节流(如 uint8_t 数组)转换为十六进制字符串的C++实现:

std::string bytesToHex(const uint8_t* data, size_t len, bool uppercase = true) {
    // 十六进制字符表(可选大写或小写)
    const char* hex_table = uppercase ? 
        "0123456789ABCDEF" : 
        "0123456789abcdef";

    std::string hex_str;
    hex_str.reserve(len * 2); // 预分配空间,每个字节对应2个字符

    for (size_t i = 0; i < len; ++i) {
        uint8_t byte = data[i];
        // 将高4位和低4位分别转换为十六进制字符
        hex_str.push_back(hex_table[(byte >> 4) & 0x0F]); // 高4位
        hex_str.push_back(hex_table[byte & 0x0F]);        // 低4位
    }

    return hex_str;
}

// 重载版本:支持直接传入 std::vector<uint8_t>
std::string bytesToHex(const std::vector<uint8_t>& data, bool uppercase = true) {
    return bytesToHex(data.data(), data.size(), uppercase);
}

使用示例:

#include <iostream>

int main() {
    // 示例1:原始字节数组
    uint8_t bytes[] = {0x12, 0xAB, 0xFF, 0x00};
    std::string hex1 = bytesToHex(bytes, sizeof(bytes));
    std::cout << "Hex (uppercase): " << hex1 << std::endl; // 输出 "12ABFF00"

    // 示例2:使用小写字母
    std::string hex2 = bytesToHex(bytes, sizeof(bytes), false);
    std::cout << "Hex (lowercase): " << hex2 << std::endl; // 输出 "12abff00"

    // 示例3:通过 vector 传递
    std::vector<uint8_t> byte_vec = {0xDE, 0xAD, 0xBE, 0xEF};
    std::string hex3 = bytesToHex(byte_vec);
    std::cout << "Hex from vector: " << hex3 << std::endl; // 输出 "DEADBEEF"

    return 0;
}

以下是为字节流转换为十六进制字符串添加分隔符支持的C++实现:

// 支持分隔符
std::string bytesToHex(const uint8_t* data, size_t len, bool uppercase = true, char separator = '\0') {
    const char* hex_table = uppercase ?
        "0123456789ABCDEF" :
        "0123456789abcdef";
    
    std::string hex_str;
    if (len == 0) return hex_str;

    // 预计算内存:每个字节2字符 + 分隔符
    size_t total_len = len * 2;
    if (separator != '\0') {
        total_len += (len - 1); // 分隔符数量为 len-1
    }
    hex_str.reserve(total_len);

    // 逐个字节处理
    for (size_t i = 0; i < len; ++i) {
        uint8_t byte = data[i];
        hex_str.push_back(hex_table[(byte >> 4) & 0x0F]); // 高4位
        hex_str.push_back(hex_table[byte & 0x0F]);        // 低4位

        // 添加分隔符(最后一个字节不添加)
        if (separator != '\0' && i != len - 1) {
            hex_str.push_back(separator);
        }
    }

    return hex_str;
}

// 重载版本:支持 std::vector<uint8_t>
std::string bytesToHex(const std::vector<uint8_t>& data, bool uppercase = true, char separator = '\0') {
    return bytesToHex(data.data(), data.size(), uppercase, separator);
}

使用示例:

#include <iostream>

int main() {
    // 示例1:无分隔符
    std::vector<uint8_t> data1 = {0xDE, 0xAD, 0xBE, 0xEF};
    std::string hex1 = bytesToHex(data1);
    std::cout << "无分隔符: " << hex1 << std::endl; // 输出 "DEADBEEF"

    // 示例2:短横线分隔符
    std::string hex2 = bytesToHex(data1, true, '-');
    std::cout << "短横线分隔: " << hex2 << std::endl; // 输出 "DE-AD-BE-EF"

    // 示例3:冒号分隔符 + 小写字母
    std::string hex3 = bytesToHex(data1, false, ':');
    std::cout << "冒号小写分隔: " << hex3 << std::endl; // 输出 "de:ad:be:ef"

    // 示例4:单个字节
    std::vector<uint8_t> data2 = {0x12};
    std::string hex4 = bytesToHex(data2, true, '-');
    std::cout << "单字节: " << hex4 << std::endl; // 输出 "12"

    return 0;
}

十六进制字符串转字节流:

std::vector<uint8_t> hexToBytes(const std::string& hex_str) {
    // 验证输入有效性
    if (hex_str.length() % 2 != 0) {
        throw std::invalid_argument("Hex string length must be even");
    }

    // 构建反向映射表(字符 -> 4位值)
    std::vector<uint8_t> lookup(256, 0xFF); // 初始化为无效值
    for (int i = 0; i < 10; ++i) {
        lookup['0' + i] = i;              // 数字0-9
    }
    for (int i = 0; i < 6; ++i) {
        lookup['A' + i] = 10 + i;        // 大写A-F
        lookup['a' + i] = 10 + i;        // 小写a-f
    }

    std::vector<uint8_t> bytes;
    bytes.reserve(hex_str.length() / 2); // 预分配空间

    for (size_t i = 0; i < hex_str.length(); i += 2) {
        // 检查字符有效性
        uint8_t high_nibble = lookup[static_cast<uint8_t>(hex_str[i])];
        uint8_t low_nibble = lookup[static_cast<uint8_t>(hex_str[i + 1])];

        if (high_nibble == 0xFF || low_nibble == 0xFF) {
            throw std::invalid_argument("Invalid hex character");
        }

        // 组合高4位和低4位
        bytes.push_back((high_nibble << 4) | low_nibble);
    }

    return bytes;
}


std::vector<uint8_t> hexToBytesWithDelimiter(const std::string& hex_str, char delimiter = '-') {
    std::vector<uint8_t> bytes;
    std::string clean_hex;
    clean_hex.reserve(hex_str.length());

    // 移除分隔符
    for (char c : hex_str) {
        if (c != delimiter) {
            clean_hex.push_back(c);
        }
    }

    return hexToBytes(clean_hex);
}

使用示例:

#include <iostream>

int main() {
    try {
        // 示例1:标准大写字符串
        std::string hex1 = "DEADBEEF";
        auto bytes1 = hexToBytes(hex1);
        // bytes1 = {0xDE, 0xAD, 0xBE, 0xEF}

        // 示例2:混合大小写
        std::string hex2 = "1a2B3c";
        auto bytes2 = hexToBytes(hex2);
        // bytes2 = {0x1A, 0x2B, 0x3C}

        // 示例3:错误输入(长度奇数)
        std::string hex3 = "123";
        auto bytes3 = hexToBytes(hex3); // 抛出异常

    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    return 0;
}
### 如何生成64位长度的十六进制字符串 要生成一个64位长度的十六进制字符串,可以通过多种编程语言来实现。以下是几种常见方式: #### 使用Python生成64位十六进制字符串 在Python中,可以借助`secrets`模块或者`os.urandom()`函数生成随机字节序列,并将其换为十六进制字符串。 ```python import secrets def generate_hex_string(length=32): # 每个字节对应两个十六进制字符,所以需要16字节生成32字符的十六进制串 random_bytes = secrets.token_bytes(length // 2) hex_string = random_bytes.hex() return hex_string.upper() # 换为大写形式 result = generate_hex_string(64) # 需要64位即32字符的十六进制字符串 print(result) ``` 上述代码片段展示了如何生成一个固定长度的十六进制字符串[^1]。这里需要注意的是,每字节转化为两位十六进制字符,因此为了得到64位(即32字符),我们需要生成16字节的数据。 --- #### 使用Java生成64位十六进制字符串 在Java中,可以使用`SecureRandom`类生成随机字节数组并将其换为十六进制字符串。 ```java import java.security.SecureRandom; import java.math.BigInteger; public class HexGenerator { public static String generateHexString(int lengthInBits) { SecureRandom secureRandom = new SecureRandom(); byte[] bytes = new byte[lengthInBits / 8]; // 将比特数换为字节数 secureRandom.nextBytes(bytes); BigInteger bigInt = new BigInteger(1, bytes); // 创建无符号BigInteger对象 String hexString = bigInt.toString(16).toUpperCase(); // 转化十六进制 while (hexString.length() < (lengthInBits / 4)) { // 补齐到目标长度 hexString = "0" + hexString; } return hexString; } public static void main(String[] args) { System.out.println(generateHexString(64)); // 输出64位十六进制字符串 } } ``` 此代码实现了安全随机数生成以及向十六进制字符串转化过程[^4]。注意,在处理过程中可能需要补齐前导零以确保最终字符串达到预期长度。 --- #### 使用C++生成64位十六进制字符串 如果采用C++作为开发环境,则可以依赖标准库组件完成这一任务。 ```cpp #include <iostream> #include <sstream> #include <iomanip> #include <random> std::string generateHexStr(size_t numBytes) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 255); std::ostringstream oss; oss << std::uppercase << std::hex << std::setfill('0'); for (size_t i = 0; i < numBytes; ++i){ int value = dis(gen); oss << std::setw(2) << value; } return oss.str(); } int main(){ size_t requiredLength = 32; // 对应于64bit除以每位占用的4bits std::cout << generateHexStr(requiredLength / 2) << "\n"; return 0; } ``` 这段程序利用了梅森旋算法(`std::mt19937`)和均匀分布随机数生成器(`std::uniform_int_distribution`)创建高质量随机数据流,并通过格式化的输出操作符将这些数值映射成所需的十六进制表现形式[^5]。 --- #### 总结 无论选用哪种技术栈,核心思路均围绕着先生产适当规模的原始数据单元——通常是字节数组,再经由特定编码机制变为目标形态的十六进制表达式。同时需留意不同平台间可能存在差异性的细节设定,比如大小写的统一性或是前置补零策略等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值