需要引入的库文件
#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;
}