Qt开发的数据转换小工具,支持16进制字符串转Qt的基本数据类型

一、介绍

因为在平时工作中经常用到十六进制转成其他数据的情况,就写一个小工具用于平时数据转换,现在分享给大家,有不足之处请多指教。界面如下:

同时里面的函数也可以单独拿出来使用,程序进行转换时可以直接调用。

二、转换过程中注意的点

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文库

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值