C语言如何解决QString与QByteArray互相转换的问题

c语言如何解决qstring与qbytearray互相转换的问题

本文讲解"c语言怎么解决qstring与qbytearray互相转换的问题",希望能够解决相关问题。

目录
  • [1] qstring与qbytearray互相转换的方法

    • qstring转qbytearray方法

    • qbytearray转qstring方法

    • qbytearray类同样不以’\0’为结尾

  • [2] qt开发串口通讯软件中的数据转换问题

    • 1.读取串口命令-qbytearray转qstring,qstring转float

    • 2.向串口写入命令

  • [3] qt qstring与qbytearray的相互转换

[1] qstring与qbytearray互相转换的方法

先要说的是qstring。

之所以把qstring单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如javascript,都是把string作为一种同int等一样的基本数据结构来实现的。

每一个gui程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构。c++语言提供了两种字符串的实现:c风格的 字符串,以’/0‘结尾;std::string,即标准模版库中的类。qt则提供了自己的字符串实现:qstring。qstring以16位 uniode进行编码。我们平常用的ascii等一些编码集都作为unicode编码的子集提供。关于编码的问题,我们会到以后的时候再详细说明。

在使用qstring的时候,我们不需要担心内存分配以及关于’/0’结尾的这些注意事项。qstring会把这些问题解决。通常,你可以把 qstring看作是一个qchar的向量。另外,与c风格的字符串不同,qstring中间是可以包含’/0’符号的,而length()函数则会返回 整个字符串的长度,而不仅仅是从开始到’/0’的长度。

同java的string类类似,qstring也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起,正像java里面的操作一样。qstring可以自动的对占用内存空间进行扩充,这种连接操作是恨迅速的。下面是这两个操作符的使用:

qstringstr="user:";
str+=username+"/n";

qstring的append()函数则提供了类似的操作,例如:

str="user:";
str.append(username);
str.append("/n");

qstring转qbytearray方法

//qt5.3.2
qstring str("hello");  
qbytearray bytes = str.toutf8(); // qstring转qbytearray方法1 
qstring str("hello");  
qbytearray bytes = str.tolatin1();  // qstring转qbytearray方法2

qbytearray转qstring方法

//qt5.3.2
    qbytearray bytes("hello world");
    qstring string = bytes;   // qbytearray转qstring方法1
    qbytearray bytes("hello world");
    qstring string;
    string.prepend(bytes);// qbytearray转qstring方法2
    qdebug() << string;

qbytearray类同样不以&rsquo;\0&rsquo;为结尾

qbytearray bytes;  
bytes.resize(5);  
bytes[0] = '1';  
bytes[1] = '2';  
bytes[2] = '3';  
bytes[3] = '\0';  
bytes[4] = 'a';  
cout << bytes << endl;

qbytearray转qstring,主要用buf.tohex()即可

    static qstring bytearraytohexstr(qbytearray buf)
    {
        qstring retstr;
        retstr.append(buf.tohex());
        return retstr;
    }

[2] qt开发串口通讯软件中的数据转换问题

在利用qt进行串口程序开发过程中,除了与串口通讯的功能实现以外,数据的转换也是比较麻烦的一件事,本篇主要介绍串口通讯中数据转换的问题,关于功能实现大家在网上搜索就能找到相关案例。

在完成串口的初始化等功能之后,实现数据的读取转换。

1.读取串口命令-qbytearray转qstring,qstring转float

从串口接收到的数据形如:“0010101821&hellip;”的16进制数,串口返回qbytearray的数据格式,通过以下方式转换为qstring,再通过截取数据中某几位,按照16进制格式转换为10进制使用。

qbytearray转qstring

static qstring serialbuffer;
qbytearray serialbuffertmp=m_serialport->readall();
serialbuffer=serialbuffer.append(serialbuffertmp);

截取第8位后4位的16进制数,并qstring转float

qstring strvalue=serialbuffer.mid(8,4);
float floatvalue=strvalue.toint(nullptr,16)

2.向串口写入命令

十进制int转16进制格式string

通常我们从qt开发的界面中使用qlineedit输入的是十进制类型的,而为了串口处理需要将其转换为16进制格式,再通过处理成串口可以解析的格式,例如十进制50转换为16进制的“32”,代码如下:

int num=dec2hexinputedit->text().toint();
qstring hexstring=qstring::number(num,16)

16进制数加法

此处参考qt 十六进制的简单应用, 十六进制的加法,它是先将数转换为10进制,相加后再转换为qstring

qstring hexari(qstring str, int addend)
{
    bool ok;
    int dec = str.touint(&ok, 16);
    qstring tmp = qstring("%1").arg(dec + addend, 5, 16, qlatin1char('0');
    return tmp;
}

[3] qt qstring与qbytearray的相互转换

qbytearray(const char *data, int size = -1) 
//qbytearray str("1234")  内存中存储可能就是对应的assic:0x31, 0x32, 0x33, 0x34
qbytearray qbytearray::fromhex(const qbytearray &hexencoded)
//将字符串的“1234”变为0x11 0x34,原本占用4字节内存,现在变为2字节。0x31, 0x32, 0x33, 0x34 ==> 0x12 0x34
qbytearray qbytearray::tohex() const
//将0x12 0x34 变为 “1234”  原本占用2字节内存,现在变为4字节 0x12 0x34 ==> 0x31, 0x32, 0x33, 0x34
int qbytearray::toint(bool *ok = q_nullptr, int base = 10) const
//str.toint(&ok, 16)将字符串 “1234”变为int型 0x1234,, 转换的前提:str内就是存的字符串,str内存的不是“0”--“9” “a”--“f”,不能转换成功
qstring(const qbytearray &ba)
//可以将qbytearray转换为字符串,我认为内存占用,以及数据都是一样的,只是类型变了,原来qbytearray表示0x31 0x32 0x33 0x34, 还是同样的数据用qstring表示了
qstring fromutf8(const qbytearray &);
//将qbytearray转换为qsting。字符串的编码方式不同,内存占用以及数据就不同,但是都可以看成char[] 数组,在qt中char 数组就是qbytearray,因此将不同编码方式的字符串转换为qstring的函数入参都是qbytearray
qstring number( a, b);
//将数字转换为字符串 将a转变为b进制, a=10  b=16  转换为“a” :  10 = 0x0a ; a=10  b=10  转换为“10”
int qstring::toint(bool *ok = q_nullptr, int base = 10) const 
//base = 16,将字符串 “12”变为 0x12
qbytearray qstring::tolatinl() const; 
//将qstring编码的字符串转换到 其他类型的字符串编码
qbytearray qstring::toutf8() const;
//举例: 字符串“1”,在内存中就是0x31 (assic 0x31表示1),只不过存储方式是qstring的编码,假如utf8与qstring的编码一样,转换出来后,还是0x31
qbytearray qstring::tolocal8bit() const; 
//假如 local8bit中 “1” 用16进制0x88表示,  那么转换后,内存的数成了0x88,
qbytearray qstring;:toucs4() const;

latin1:so-8859-1编码是单字节编码,向下兼容ascii,其编码范围是0x00-0xff
utf8字符集以2个或以上的字节表示一个汉字,实际上具体的数值和unicode有很大的相关性
unicode字符集以2个或以上的字节表示一个汉字。
gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种。
ucs:通用字符集(universal character set, ucs)是由iso制定的iso 10646(或称iso/iec 10646)标准所定义的标准字符集。ucs-2用两个字节编码,ucs-4用4个字节编码。

关于 "c语言怎么解决qstring与qbytearray互相转换的问题" 就介绍到此。希望多多支持硕编程

下一节:c++中的可移植性和跨平台开发教程详解

c语言编程技术

相关文章