一、介绍
因为在平时工作中经常用到十六进制转成其他数据的情况,就写一个小工具用于平时数据转换,现在分享给大家,有不足之处请多指教。界面如下:
同时里面的函数也可以单独拿出来使用,程序进行转换时可以直接调用。
二、转换过程中注意的点
1、内存拷贝函数的使用
memcpy(&output, charlist, sizeof(output));
memcpy是内存拷贝函数,它可以实现指定内存大小的拷贝。
它有三个参数:
第一个参数类型是void*,用来接收目的地的首地址;
第二个参数类型是const void*,用来接收源头内容的首地址(拷贝时源头的内容不会被改变,用const修饰会更安全);
第三个参数类型是size_t(无符号整型),表示从源头地址开始向后需要拷贝的字节数。
详细的函数介绍可以参考:内存函数(memcpy、memmove、memset、memcmp)_qt memcpy-CSDN博客
2、字符串转QByteArray
bool isOk = false;
QByteArray bytes;
for(int i=0; i<result.length(); i+=2)
{
QString subStr = result.mid(i,2);
int tempInt = subStr.toInt(&isOk,16);
isSuccess = isOk;
if(!isOk) break;
bytes.append(tempInt);
}
十六进制字符串转化成QByteArray,这个需要先转化成int类型,再放入QByteArray。如果是以字符串放入QByteArray,结果是错误的。
3、大小端的区分
简单的讲就是:
大端模式是高位在前低位在后,比如0x01FF,0x01就是高八位、0xFF就是低八位.
小端模式是低位在前高位在后,转化的时候是反着来的。
如果转为为quint16,那么大段模式 0x01FF = 511,小端模式 0x01FF = 65281
大小端模式详解参考:大端模式、小端模式及其在Qt中的转换_qfrombigendian-CSDN博客
三、完整代码
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void OnBtnChangeClick();
private:
//补全字符串,并放入QByteArray
QByteArray MakeUpStrToBytesArray(QString oldStr,int len,bool &isSuccess);
//字符数组转quint64
quint64 Getquint64(char* data, bool isLittle = false);
//字符数组转quint32
quint32 Getquint32(char* data, bool isLittle = false);
//字符数组转quint16
quint16 Getquint16(char* data, bool isLittle = false);
//字符数组转quint8
quint8 Getquint8(char* data);
//字符数组转qint64
qint64 Getqint64(char* data, bool isLittle = false);
//字符数组转qint32
qint32 Getqint32(char* data, bool isLittle = false);
//字符数组转qint16
qint16 Getqint16(char* data, bool isLittle = false);
//字符数组转qint8
qint8 Getqint8(char* data);
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->btnChange,SIGNAL(clicked()),this,SLOT(OnBtnChangeClick()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnBtnChangeClick()
{
ui->lineEdit->setText("");
QString textContent = ui->textEdit->toPlainText().remove(QRegExp("\\s"));
if(textContent.length() == 0) return;
bool isLittle = !ui->checkBig->isChecked();
bool isSuccess = false;
if(ui->radioqint64->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,8,isSuccess);
qint64 result = Getqint64(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioqint32->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,4,isSuccess);
qint32 result = Getqint32(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioqint16->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,2,isSuccess);
qint16 result = Getqint16(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioqint8->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,1,isSuccess);
qint8 result = Getqint8(bytes.data());
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioquint64->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,8,isSuccess);
quint64 result = Getquint64(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioquint32->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,4,isSuccess);
quint32 result = Getquint32(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioquint16->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,2,isSuccess);
quint16 result = Getquint16(bytes.data(),isLittle);
ui->lineEdit->setText(QString::number(result));
}
if(ui->radioquint8->isChecked())
{
QByteArray bytes = MakeUpStrToBytesArray(textContent,1,isSuccess);
quint8 result = Getquint8(bytes.data());
ui->lineEdit->setText(QString::number(result));
}
if(!isSuccess)
{
ui->textEdit->setPlainText("");
ui->lineEdit->setText("输入字符串无效!");
}
}
QByteArray MainWindow::MakeUpStrToBytesArray(QString oldStr, int len,bool &isSuccess)
{
int strLen = len * 2;
QString result = oldStr;
if(oldStr.length()>strLen)
{
result = oldStr.right(strLen);
}
else if(oldStr.length()<strLen)
{
result = QString(strLen - oldStr.length(),'0') + oldStr;
}
QString text;
for(int i=0;i<result.length();i+=2)
{
text += result.mid(i,2)+" ";
}
ui->textEdit->setPlainText(text);
bool isOk = false;
QByteArray bytes;
for(int i=0; i<result.length(); i+=2)
{
QString subStr = result.mid(i,2);
int tempInt = subStr.toInt(&isOk,16);
isSuccess = isOk;
if(!isOk) break;
bytes.append(tempInt);
}
return bytes;
}
quint64 MainWindow::Getquint64(char *data, bool isLittle)
{
quint64 output;
char charlist[8] = {};
for(int i=0;i<8;i++)
{
if(!isLittle) charlist[7-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
quint32 MainWindow::Getquint32(char *data, bool isLittle)
{
quint32 output;
char charlist[4] = {};
for(int i=0;i<4;i++)
{
if(!isLittle) charlist[3-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
quint16 MainWindow::Getquint16(char *data, bool isLittle)
{
quint16 output;
char charlist[2] = {};
for(int i=0;i<2;i++)
{
if(!isLittle) charlist[1-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
quint8 MainWindow::Getquint8(char *data)
{
quint8 output = data[0];
return output;
}
qint64 MainWindow::Getqint64(char *data, bool isLittle)
{
qint64 output;
char charlist[8] = {};
for(int i=0;i<8;i++)
{
if(!isLittle) charlist[7-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
qint32 MainWindow::Getqint32(char *data, bool isLittle)
{
qint32 output;
char charlist[4] = {};
for(int i=0;i<4;i++)
{
if(!isLittle) charlist[3-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
qint16 MainWindow::Getqint16(char *data, bool isLittle)
{
qint16 output;
char charlist[2] = {};
for(int i=0;i<2;i++)
{
if(!isLittle) charlist[1-i] = data[i];
else charlist[i] = data[i];
}
memcpy(&output, charlist, sizeof(output));
return output;
}
qint8 MainWindow::Getqint8(char *data)
{
qint8 output = data[0];
return output;
}
完整工程文件地址:Qt开发的数据转换小工具资源-CSDN文库