[QT]QByteArray與char、int、float(及其數組)、string之間的互相轉化

2021-03-03 CSharp編程大全
1.問題來源

要用SQLite資料庫去保存一段定長的char型數組,裡面可能有\0等字符,所以當作字符串varchar處理鐵定丟失數據,所以要用二進位保存BLOB,這樣對應的QT數據類型要用QByteArray進行處理,原來只用到QByteArray轉換成 char* 類型,其它的轉換還沒搞過,一弄發現還是有些門道,為了以後不再繼續造輪子,就先寫出來,標記一下。

2.QByteArray與char*的轉換2.1 QByteArray 轉 char*方式1 傳統方式data()和size()函數 (方便)
QByteArray array(10, 'Q');
char *buf;int len;buf = array.data();len = array.size();

方式2 memcpy()方式 (靈活)
QByteArray array(9,'Q');char buf[10];int len_array = array.size();int len_buf = sizeof(buf);int len = qMin( len_array, len_buf );
memcpy( buf, array, len );

2.2 char* 轉 QByteArray方法1 利用構造函數 (方便)

char buf[10];for (int i = 0; i < 10; i++){    buf[i] = (i + 1) % 3;}
QByteArray array;array = QByteArray(buf, 10);

方式2 memcpy()方式 (靈活)

char buf[10];for (int i = 0; i < 10; i++){    buf[i] = (i + 1) % 3;}
QByteArray array;array.resize(sizeof(buf));memcpy(array.data(), buf, sizeof(buf));



3.QByteArray與int 以及int[] 的轉換3.1. int 與 QByteArray 互轉[1] int 轉 QByteArray

int  intVar = 199;
QByteArray array;int len_intVar = sizeof(intVar);array.resize(len_intVar);memcpy(array.data(), &intVar, len_intVar);


[2]QByteArray 轉 int

int  outIntVar;memcpy(&outIntVar, array.data(), len_intVar);


3.2. int[] 與 QByteArray 互轉[1] int[] 轉 QByteArray

int  intVar[4] = {1,2,9,0};
QByteArray array;int len_intVar = sizeof(intVar);array.resize(len_intVar);memcpy(array.data(), &intVar, len_intVar);

[2]QByteArray 轉 int[]

int  outIntVar[4];memcpy(&outIntVar, array.data(), len_intVar);

4.QByteArray與float 以及float[] 的轉換

其實完全可以參考第3節,int的用法.

4.1. float[] 與 QByteArray 互轉[1] float[] 轉 QByteArray

float  fVar[4] = { 1.1, 2.3, 9.5, 0.2 };
QByteArray array;int len_fVar = sizeof(fVar); array.resize(len_intVar);memcpy(array.data(), &fVar, len_fVar);

[2]QByteArray 轉 float[]

float  outFvar[4];memcpy(&outIntVar, array.data(), len_fVar);

4.2. float 與 QByteArray 互轉

可以安全參考int。

5.// 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類同樣不以』\0』為結尾:如

QByteArray bytes;

bytes.resize(5);

bytes[0] = '1';

bytes[1] = '2';

bytes[2] = '3';

bytes[3] = '\0';

bytes[4] = 'a';

cout << bytes << endl;

相關焦點

  • 在C++中將string轉換為char數組
    convert std::string to char[] or char* data type』。// string轉換到char數組CPP程序#include <bits/stdc++.h> using namespace std; // 驅動代碼int main() { // 為字符串賦值 string s = "www.linuxmi.com"; int n
  • C語言中char int轉換問題
    printf("%d", a[0]-0);//輸出結果為32,int轉化為char*********************************** linux c ***********************************(1)字符串轉換成數字,用atoi,atol,atof,分別對應的是整型,long
  • c語言基本數據類型short、int、long、char、float、double
    C 語言包含的數據類型如下圖所示:一、數據類型與「模子」short、int、long、char、float、
  • 選擇題 | 6 C數組
    1.已定義「int i; char x[10];」,為了給x數組賦值,以下正確的語句是(D)。A.x[10]= "Hello! ";B.x="Hello! ";C.x[]="Hello!A.數組的下標可以是float類型B.數組的元素的類型可以不同C.初始化列表中初始值的個數多於數組元素的個數也是可以的D.區分數組的各個元素的方法是通過下標6.若有定義「char str1[30],str2[30];」,則輸出較大字符串的正確語句是(C)。
  • 單片機的C語言中數組的用法
    用以下例程說明數組的建立、數據操作:#includeunsigned char array[10];//定義一個有10個單元的數組void main(){unsigned char i;for(i=0;i<10;i++){
  • MFC下的cstring與char互相轉換方法
    Mfc下的cstring與char互相轉換方法本次課程主要來為大家講一下平時我們總是在mfc下環境開發中使用的char類型的數組和cstring格式的轉換,還有在qt下該如何轉換,送給有需要的小夥伴們。
  • 嵌入式系統串口傳輸int float型數據的處理
    在做嵌入式系統通信時往往會用到串口,包括嵌入式系統將數據傳輸給PC,或者是嵌入式系統之間進行數據傳輸,這時候就會遇到發送數據的問題。我們知道單片機通過串口發送數據時往往是一次一個字節(8位),如果傳輸char(8位)型數據則很好辦,只需要直接發送就可以了,但是在發送int型數據和float型數據時就會稍微有些複雜。
  • Python列表與VEX數組之間異同比較
    Python列表和VEX數組之間有很多異曲同工之處,拿它們做比較學習是很值得的一件事。
  • C++ string中c_str()、data()、copy(p,n)函數的用法
    類提供了3個成員函數來從一個string得到c類型的字符數組:c_str()、data()、copy(p,n)。1、c_str():生成一個const char*指針,指向以空字符終止的數組。註:①這個數組的數據是臨時的,當有一個改變這些數據的成員函數被調用後,其中的數據就會失效。因此要麼現用先轉換,要麼把它的數據複製到用戶自己可以管理的內存中。注意。
  • 面試懵了:StringBuilder為什麼線程不安全
    分析在分析設個問題之前我們要知道StringBuilder和StringBuffer的內部實現跟String類一樣,都是通過一個char數組存儲字符串的,不同的是String類裡面的char數組是final修飾的,是不可變的,而StringBuilder和StringBuffer的char數組是可變的。
  • 面試題:StringBuilder為什麼線程不安全?
    分析在分析設個問題之前我們要知道StringBuilder和StringBuffer的內部實現跟String類一樣,都是通過一個char數組存儲字符串的,不同的是String類裡面的char數組是final修飾的,是不可變的,而StringBuilder和StringBuffer的char數組是可變的。
  • PHP丨PHP基礎知識之數據類型之間相互轉換
    (int)、(integer):轉換成整形(float)、(double)、(real):轉換成浮點型(string):轉換成字符串(bool)、(boolean):轉換成布爾類型(array):轉換成數組(object):轉換成對象一、自動轉換類型:自動類型轉換就是編譯器默默地、隱式地、
  • 不要在循環體中使用 array_merge ()
    array_merge() 合併● eachTwo() 循環體結束後使用 array_merge() 合併● eachThree() 循環體嵌套實現數組合併● eachFour() 循環體使用 運算符 + 拼接合併● getNiceFileSize() 將內存佔用轉化成人類可讀的方式/** * Class ArrayMerge
  • Godot 內置類型 之 String
    舉例:capitalize camelCase mixed_with_underscores返回:Capitalize Camel Case Mixed With Underscoresint casecmp_to ( String to )對另一個字符串執行區分大小寫的比較。如果小於,則返回-1;如果大於,則返回1;如果等於,則返回0。