C++Hex——一个全能的16进制操作工具库

发布时间:2023-05-19

一、C++Hex是什么

CHex是一个全能的16进制操作工具库,可以方便地进行对16进制数据的处理,包括16进制编解码、16进制字符串转化为二进制数据、十六进制数与其他进制数之间的转换等。 在现代软件开发中,十六进制数据的处理具有重要的作用,所以CHex这个工具库有助于提高程序开发效率。

二、C++Hex主要功能

C++Hex库中的主要功能如下:

  1. 将16进制字符串转化为二进制数据
  2. 将二进制数据转化为16进制字符串
  3. 将16进制字符串转化为十进制数
  4. 将十进制数转化为16进制字符串
  5. 将16进制字符串转化为ASCII字符串
  6. 将ASCII字符串转化为16进制字符串
  7. 计算校验和

三、C++Hex使用示例

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iomanip>
#include <ctype.h>
using namespace std;
//十六进制字符串转化为二进制数据
vector<char> hexStrToBytes(const string& hexStr) {
    vector<char> bytes;
    for (size_t idx = 0; idx < hexStr.size(); idx += 2) {
        unsigned int byte;
        stringstream ss;
        ss << hex << hexStr.substr(idx, 2);
        ss >> byte;
        bytes.push_back(static_cast<char>(byte));
    }
    return bytes;
}
//计算校验和
unsigned char calcChecksum(const vector<char>& bytes) {
    unsigned char checksum = 0;
    for (auto byte : bytes) {
        checksum ^= static_cast<unsigned char>(byte);
    }
    return checksum;
}
//二进制数据转化为十六进制字符串
string bytesToHexStr(const vector<char>& bytes) {
    std::stringstream ss;
    ss << hex;
    for (auto byte : bytes) {
        ss << setw(2) << setfill('0') << static_cast<unsigned int>(static_cast<unsigned char>(byte));
    }
    return ss.str();
}
int main(int argc, char* argv[])
{
    string hexStr = "16DAAD2F3C23";
    vector<char> bytes = hexStrToBytes(hexStr);
    unsigned char checksum = calcChecksum(bytes);
    string checksumHexStr = bytesToHexStr({ checksum });
    cout << "Hex string: " << hexStr << "\n";
    cout << "Checksum: " << setw(2) << setfill('0') << static_cast<unsigned int>(checksum) << "\n";
    cout << "Checksum (hex): " << checksumHexStr << "\n";
    return 0;
}

四、C++Hex的功能拓展

基于C++Hex库的基础上可以进行拓展,例如计算CRC校验码,将16进制数据转化为其他进制的数值等操作。 主要的代码修改如下:

//计算CRC校验码
unsigned short calcCrc(const vector<char>& bytes) {
    unsigned short crc = 0xFFFF;
    for (auto byte : bytes) {
        crc ^= static_cast<unsigned char>(byte);
        for (size_t bitIndex = 0; bitIndex < 8; bitIndex++) {
            crc = (crc & 0x0001) ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
        }
    }
    return crc;
}
//将16进制字符串转化为十六进制数
int hexToInt(const string& hexStr) {
    int num;
    stringstream ss;
    ss << hex << hexStr;
    ss >> num;
    return num;
}
//将十六进制数转化为十进制数
int hexToDec(const string& hexStr) {
    return static_cast<int>(strtol(hexStr.c_str(), nullptr, 16));
}
int main(int argc, char* argv[])
{
    string hexStr = "16DAAD2F3C23";
    vector<char> bytes = hexStrToBytes(hexStr);
    unsigned char checksum = calcChecksum(bytes);
    string checksumHexStr = bytesToHexStr({ checksum });
    unsigned short crc = calcCrc(bytes);
    int hexNum = hexToInt(hexStr);
    int decNum = hexToDec(hexStr);
    cout << "Hex string: " << hexStr << "\n";
    cout << "Checksum: " << setw(2) << setfill('0') << static_cast<unsigned int>(checksum) << "\n";
    cout << "Checksum (hex): " << checksumHexStr << "\n";
    cout << "CRC: " << hex << setw(4) << setfill('0') << crc << "\n";
    cout << "Hex num: " << hexNum << "\n";
    cout << "Dec num: " << decNum << "\n";
    return 0;
}