1. 程式人生 > >QByteArray儲存二進制數據(包括結構體,自定義QT對象)

QByteArray儲存二進制數據(包括結構體,自定義QT對象)

only 還原 多個 return ado com ++ iteye cpp

因為利用QByteArray可以很方便的利用其API對內存數據進行訪問和修改, 構建數據庫blob字段時必不可少; 那如何向blob內寫入自定義的結構體和類

1. 利用memcpy拷貝內存數據

//自定義person結構體

Cpp代碼 技術分享圖片
  1. typedef struct
  2. {
  3. int age;
  4. char name[20];
  5. }Person;
  6. //向QByteArray寫入多個結構體
  7. void writeStruct()
  8. {
  9. QByteArray ba;
  10. ba.resize(2*sizeof(Person)); //設置容量
  11. //序列化
  12. for(int i=0;i<2;i++)
  13. {
  14. Person p1;
  15. p1.age=10+i;
  16. strcpy(p1.name,"javaeye");
  17. memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指針移動,寫入多個數據
  18. }
  19. //還原數據
  20. Person *person=(Person*)ba.data();
  21. qDebug()<<person->age<<"---"<<person->name;
  22. person++;
  23. qDebug()<<person->age<<"---"<<person->name;
  24. }

memcpy只能處理字段為基本類型的結構體, 當使用QString name, 我用person->name去訪問其值, 程序崩潰; 由此可見,內存數據無法還原構建成QString類. 如果要寫入自定的QT類, 只能借助QBuffer了, 通過二進制流寫入

2. QBuffer寫入QT自定義結構體

Cpp代碼 技術分享圖片
  1. //QBuffer序列化自定義對象
  2. typedef struct
  3. {
  4. int age;
  5. QString name;
  6. }QPerson;
  7. /**
  8. *@brief 重載自定義對象的輸入
  9. */
  10. inline QDataStream &operator<<(QDataStream &out,const QPerson &per)
  11. {
  12. out<<per.age<<per.name;
  13. return out;
  14. }
  15. /**
  16. *@brief 重載自定義對象的輸出
  17. */
  18. inline QDataStream &operator>>(QDataStream &in,QPerson &per)
  19. {
  20. int age;
  21. QString name;
  22. in>>age>>name;
  23. per.age=age;
  24. per.name=name;
  25. return in;
  26. }
  27. /**
  28. * @brief QBuffer能處理QT自定義類型
  29. */
  30. void testQBuffer()
  31. {
  32. QByteArray ba;
  33. ba.resize(2*sizeof(QPerson));
  34. QBuffer buffer(&ba);
  35. buffer.open(QIODevice::WriteOnly);
  36. //輸入
  37. QDataStream out(&buffer);
  38. for(int i=0;i<2;i++)
  39. {
  40. QPerson per;
  41. per.age=20+i;
  42. per.name=QString("sun_%1").arg(i+1);
  43. out<<per;
  44. }
  45. buffer.close();
  46. //輸出
  47. QBuffer buf(&ba);
  48. buf.open(QIODevice::ReadOnly);
  49. QDataStream in(&buf);
  50. for(int i=0;i<2;i++)
  51. {
  52. QPerson per;
  53. in>>per;
  54. qDebug()<<per.age<<"---"<<per.name;
  55. }
  56. buf.close();
  57. }

QByteArray儲存二進制數據(包括結構體,自定義QT對象)