C++ 十六进制字符串和短整型相互转换

需要引入的库文件

 #include <sstream>

一、十六进制字符串转短整型(有符号),包含大小端

short getShortFromHexStr(string hexStr, bool isBigEdian)
{
    if (hexStr.length() != 4) {
        return 0;
    }
    string bigEdianStr = hexStr;
    // 先将小端字符串转大端字符串
    if (!isBigEdian) {
        bigEdianStr = "";
        // 按字节掉转顺序,例如 0A00-->000A
        for (int i = hexStr.length() - 2; i >= 0; i -= 2) {
            bigEdianStr += hexStr.substr(i, 2);
        }
    }
    return std::stoi(bigEdianStr, 0, 16);
}

二、短整型(有符号)转十六进制字符串,包含大小端

string getHexStrFromShort(short data, bool isBigEdian)
{
    int from = data;
    // short转16进制,最大是FFFF,即长度为4,多加一位用于数组结尾\0使用
    char to[5];
    itoa(from, to, 16);
    string tmp = to;

    string prefix0 = "";
    // 补0
    if (tmp.length() < 4) {
        for (unsigned int i = 0; i < 4 - tmp.length(); i++) {
            prefix0 += "0";
        }
    }
    tmp = prefix0 + tmp;
    string result = tmp;
    if (!isBigEdian) {
        result = "";
        // 按字节掉转顺序,例如 0A00-->000A
        for (int i = tmp.length() - 2; i >= 0; i -= 2) {
            result += tmp.substr(i, 2);
        }
    }
    return result;
}

三、十六进制字符串转短整型(无符号),包含大小端

unsigned short getUnShortFromHexStr(string hexStr, bool isBigEdian)
{
    if (hexStr.length() != 4) {
        return 0;
    }
    string bigEdianStr = hexStr;
    // 先将小端字符串转大端字符串
    if (!isBigEdian) {
        bigEdianStr = "";
        // 按字节掉转顺序,例如 0A00-->000A
        for (int i = hexStr.length() - 2; i >= 0; i -= 2) {
            bigEdianStr += hexStr.substr(i, 2);
        }
    }
    return std::stoul(bigEdianStr, 0, 16);
}

 四、短整型(无符号)转十六进制字符串,包含大小端

string getHexStrFromUnShort(unsigned short data, bool isBigEdian)
{
    std::ostringstream oss;
    oss << std::hex << static_cast<unsigned int>(data); // 需要先将无符号短整型转换为无符号整型再输入到oss流中
    std::string tmp(oss.str()); // 获取转换后的十六进制字符串

    string prefix0 = "";
    // 补0
    if (tmp.length() < 4) {
        for (unsigned int i = 0; i < 4 - tmp.length(); i++) {
            prefix0 += "0";
        }
    } else if (tmp.length() > 4) {
        tmp = tmp.substr(tmp.length() - 4, 4);
    }
    tmp = prefix0 + tmp;
    string result = tmp;
    if (!isBigEdian) {
        result = "";
        // 按字节掉转顺序,例如 0A00-->000A
        for (int i = tmp.length() - 2; i >= 0; i -= 2) {
            result += tmp.substr(i, 2);
        }
    }
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值