不同进制的数据展示(十进制、十六进制、编码方式)
目录
1、十六进制的数值转为十进制(可能是补码)
2、十进制转为十六进制(负数要转为补码)
背景:
(1) 接收到通讯的数据,把数据读取出来,并转成自己想要的格式。
(2)数值展示,要是负数的话,是以补码的形式显示;
1、十六进制的数值转为十进制(可能是补码)
eg:拿到的数据为:0xFF 0x9B
int hexToSignedInt(const QString &hexStr, int bitWidth)
{QByteArray byteArray = QByteArray::fromHex(hexStr.toUtf8());quint64 unsignedVal = 0;for (const auto &byte : byteArray) {unsignedVal = (unsignedVal << 8) | static_cast<quint64>(byte);}if (bitWidth < 8 * sizeof(unsignedVal)) {unsignedVal &= (1ULL << (bitWidth)) - 1; // 截断高位}bool isNegative = (unsignedVal >> (bitWidth - 1)) & 1;return isNegative ? (unsignedVal - (1ULL << bitWidth)) : unsignedVal;
}//实例
hexToSignedInt("FF9B", 32);
2、十进制转为十六进制(负数要转为补码)
eg:拿到的数据为:-10
QString binaryToHexQt(const QString &binaryStr)
{QString hexStr;int len = binaryStr.length();// 从右向左每4位分组处理for (int i = len; i > 0; i -= 4){int startPos = qMax(0, i - 4);QString chunk = binaryStr.mid(startPos, i - startPos);// 二进制转十进制int decimalValue = 0;for (int j = 0; j < chunk.length(); j++){decimalValue = (decimalValue << 1) | (chunk[j].toLatin1() - '0');}// 十进制转十六进制字符hexStr.prepend(QString("%1").arg(decimalValue, 0, 8).toUpper());}return hexStr;
}//实例:-10 转为十六进制:FFF6
binaryToHexQt("FFF6");
未完待续。。。