[QT] QDataStream類參考

來源:互聯網
上載者:User

QDataStream類提供了位元據到QIODevice的序列化。

#include <qdatastream.h>


有成員函數的列表。

公有成員
  • QDataStream
    ()
  • QDataStream
    ( QIODevice * d )
  • QDataStream
    ( QByteArray a, int mode )
  • virtual ~QDataStream
    ()
  • QIODevice * device
    () const
  • void setDevice
    ( QIODevice * d )
  • void unsetDevice
    ()
  • bool atEnd
    () const
  • bool eof () const  (obsolete)
  • enum ByteOrder
    { BigEndian, LittleEndian }
  • int byteOrder
    () const
  • void setByteOrder
    ( int bo )
  • bool isPrintableData
    () const
  • void setPrintableData
    ( bool enable )
  • int version
    () const
  • void setVersion
    ( int v )
  • QDataStream & operator>>
    ( Q_INT8 & i )
  • QDataStream & operator>>
    ( Q_UINT8 & i )
  • QDataStream & operator>>
    ( Q_INT16 & i )
  • QDataStream & operator>>
    ( Q_UINT16 & i )
  • QDataStream & operator>>
    ( Q_INT32 & i )
  • QDataStream & operator>>
    ( Q_UINT32 & i )
  • QDataStream & operator>>
    ( Q_LONG & i )
  • QDataStream & operator>>
    ( Q_ULONG & i )
  • QDataStream & operator>>
    ( float & f )
  • QDataStream & operator>>
    ( double & f )
  • QDataStream & operator>>
    ( char *& s )
  • QDataStream & operator<<
    ( Q_INT8 i )
  • QDataStream & operator<<
    ( Q_UINT8 i )
  • QDataStream & operator<<
    ( Q_INT16 i )
  • QDataStream & operator<<
    ( Q_UINT16 i )
  • QDataStream & operator<<
    ( Q_INT32 i )
  • QDataStream & operator<<
    ( Q_UINT32 i )
  • QDataStream & operator<<
    ( Q_LONG i )
  • QDataStream & operator<<
    ( Q_ULONG i )
  • QDataStream & operator<<
    ( float f )
  • QDataStream & operator<<
    ( double f )
  • QDataStream & operator<<
    ( const char * s )
  • QDataStream & readBytes
    ( char *& s, uint & l )
  • QDataStream & readRawBytes
    ( char * s, uint len )
  • QDataStream & writeBytes
    ( const char * s, uint len )
  • QDataStream & writeRawBytes
    ( const char * s, uint len )

詳細描述

QDataStream類提供了位元據到QIODevice的序列化。

 

資料流是一個編碼資訊的二進位流,它與主機的作業系統、CPU或位元組順序100%的沒有關係。比如一個在PC的Windows下寫的資料流可以在Sun
SPARC的Solaris中讀出。

QTextStream.
你也可以使用一個資料流來讀/寫原始的未編碼的位元據。
如果你想“解析”輸入資料流,請參考QTextStream。

QDataStream類實現了基本類型的序列化,比如char
、short
、int
、char*

等。更加複雜的類型的序列化是通過把資料分解為簡單單元來實現的。

資料流和QIODevice合作非常緊密。QIODevice描述了一個可以從中讀資料和向它寫資料的輸入/輸出介質。QFile類就是一個IO裝置的例子。

執行個體(向一個流中寫位元據):

    QFile f( "file.dta" );
f.open( IO_WriteOnly );
QDataStream s( &f ); // 我們將把資料序列化至檔案f
s << "the answer is"; // 序列化一個字串
s << (Q_INT32)42; // 序列化一個整數

執行個體(從一個流中讀位元據):

    QFile f( "file.dta" );
f.open( IO_ReadOnly );
QDataStream s( &f ); // 從檔案f中讀取序列化的資料
QString str;
Q_INT32 a;
s >> str >> a; // 提取出“the answer is”和42

每一個要寫到流中的項都被寫成一種預定義的二進位格式,這種格式取決於這個項的類型。Qt中支援的類型有QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant和其它一些。支援數
據流的所有的Qt類型的列表請看QDataStream操作
符的格式。

舉個例子,char*
字串被寫做一個等於包括NUL位元組的字串長度的32位整數,後面跟著字串中包括NUL位元組
的所有位元組。當讀取char*
字串的時候,先讀4個位元組建立一個32位長度值,然後讀取包括NUL的這麼多的位元組到char*

符串中。

初始的IODevice通常在建構函式中設定,但是也可以使用setDevice()
來改變。如果你到達了資料的終點(或者如果沒有IODevice被設定),atEnd()將
返回真。

如果你希望資料和以前版本的Qt一致,請使用setVersion()。

如果你希望資料是人們可讀的,比如,用於調試,你可以用setPrintableData()
設定資料流為可列印資料模式。然後這個資料寫起來慢一些,並且膨脹起來但已經是人們可以讀取的格式了。

如果你正在產生一種新的位元據格式,比如是你的應用程式建立的一種文檔的檔案格式,你可以使用QDataStream來把資料寫成一種可移植的格式。
通常,你可以寫一個包含幻數字串和版本資訊的簡要的頭資訊,這樣可以給你以後的擴充提供一定的空間。比如:

 

    QFile f( "file.xxx" );
f.open( IO_WriteOnly );
QDataStream s( &f );

// 寫一個含有“幻數”和版本號碼的頭
s << (Q_UINT32)0xa0b0c0d0;
s << (Q_INT32)123;

// 寫資料
s << [lots of interesting data]

然後這樣讀:

 

    QFile f( "file.xxx" );
f.open( IO_ReadOnly );
QDataStream s( &f );

// 讀取並檢查頭
Q_UINT32 magic;
s >> magic;
if ( magic != 0xa0b0c0d0 )
return XXX_BAD_FILE_FORMAT;

// 讀取版本號碼
Q_INT32 version;
s >> version;
if ( version < 100 )
return XXX_BAD_FILE_TOO_OLD;
if ( version > 123 )
return XXX_BAD_FILE_TOO_NEW;
if ( version <= 110 )
s.setVersion(1);

// 讀取資料
s >> [很多有趣的資料];
if ( version > 120 )
s >> [在1.2版中的新資料XXX];
s >> [其它有趣的資料];

當你序列化資料的時候,你可以選擇你要使用的位元組順序。預設的設定是高位元組在前。把它改變為低位元組在前會破壞可移植性(除非讀取程式也是用低位元組在前)。
我們建議你使用預設設定,除非你有特殊需要。

讀寫原始位元據

你也許希望把你自己的原始位元據直接寫到資料流中,或者從資料流中直接讀取它們。資料可以使用
readRawBytes()
從流中讀取到一個預先分配好的char*。同樣地也可以使用writeRawBytes()
把資料寫到流中。注意,任何資料的編碼/解碼就只能由你自己來完成了。

一對相似的函數readBytes()
和writeBytes()。
它們與操作未經處理資料
的那兩個的區別是:readBytes()先讀取可讀的資料長度到一個Q_UINT32,然後讀取這個數量的位元組到
已經預先分配空間的char*;writeBytes()寫一個包含資料長度的Q_UNIT32,然後再是資料。注意任何資料的編碼/解碼(除了長度
Q_UINT32)都必須由你自己來做。

 

也可以參考QTextStream、QVariant和輸入/輸出和網路。

成員類型文檔
QDataStream::ByteOrder

讀/寫資料時使用的位元組順序。

  • QDataStream::BigEndian
    - 高位在前(預設的)
  • QDataStream::LittleEndian
    - 低位在前
成員函數文檔
QDataStream::QDataStream ()

構造一個沒有IO裝置的資料流。

 

也可以參考setDevice()。


QDataStream::QDataStream (
QIODevice * d
)

構造一個使用IO裝置d
的資料流。

警告:
如果你使用QSocket或QSocketDevice來
作為IO裝置d
進行讀資料,為了確保操作能夠成功地執行,你必須確認在通訊端提供了足夠的資料,QDataStream沒有任何方法來
處理和恢複這種讀取缺少地情況。

 

也可以參考setDevice()
and device().


QDataStream::QDataStream (
QByteArray a,
int mode )

構造一個通過內建的QBuffer設
備來操作一個位元組數組a
的資料流。mode
就是QIODevice::mode(),
通常不是IO_ReadOnly就
是IO_WriteOnly。

執行個體:

    static char bindata[] = { 231, 1, 44, ... };
QByteArray a;
a.setRawData( bindata, sizeof(bindata) ); // a指向bindata
QDataStream s( a, IO_ReadOnly ); // 開啟a的資料
s >> [something]; // 讀取原始的bindata
a.resetRawData( bindata, sizeof(bindata) ); // 完成

QByteArray::setRawData()
函數不是提供給沒有經驗的人的。


QDataStream::~QDataStream
() [虛]

銷毀這個資料流。

解構函式對當前的IO裝置沒有任何效果,除非他是一個通過建構函式
傳遞的一個處理QByteArray的內部IO
裝置,這種情況下,內部IO裝置被銷毀。。

bool
QDataStream::atEnd () const

如果IO裝置已經到達終點(流或檔案的終點),或者如果沒有IO裝置被設定,返回真,否則返回假,比如,如果IO裝置當前位置在終點之前。

 

也可以參考QIODevice::atEnd()。

int
QDataStream::byteOrder ()
const

返回當前位元組順序設定——不是BigEndian就
是LittleEndian

 

也可以參考setByteOrder()。

QIODevice *
QDataStream::device () const

返回當前設定的IO裝置。

也可以參考setDevice()
和unsetDevice()。

bool
QDataStream::eof () const

這個函數是廢棄的。
它的提供只是為了保證舊代碼能夠工作。我們強烈建議在新代碼中不要使用它。

如果IO裝置到達終點(流或檔案的終點),或者如果沒有IO裝置被設定,返回真。

如果當前的IO的讀寫位置在終點之前,返回假。

 

也可以參考QIODevice::atEnd()。

bool
QDataStream::isPrintableData
() const

如果可列印資料標記已經被設定,返回真。

也可以參考setPrintableData()。

QDataStream &

QDataStream::operator<< ( Q_INT8 i )

寫一個有符號的位元組i

到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_UINT8 i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個無符號的位元組i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_INT16 i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個有符號的16位整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_UINT16 i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個無符號的16位整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_INT32 i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個有符號的32位整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_UINT32 i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個無符號的32位整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< ( Q_LONG i
)

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個有符號的,長度為系統字長度的整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
Q_ULONG i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個無符號的,長度為系統字長度的整數i
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< ( float f )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個使用標準IEEE754格式的32位浮點數f
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< ( double f
)

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個使用標準IEEE754格式的64位浮點數f
到流中並返迴流的引用。

QDataStream &

QDataStream::operator<< (
const char * s )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

寫一個以“/0”結尾的字串s
到流中並返迴流的引用。

這個字串是使用writeBytes()
序列化的。

QDataStream &

QDataStream::operator>> (
Q_INT8 & i )

從流中讀取一個有符號的位元組到i

並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_UINT8 & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個無符號的位元組到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_INT16 & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個有符號的16位整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_UINT16 & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個無符號的16位整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_INT32 & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個有符號的32位整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_UINT32 & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個無符號的32位整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_LONG & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個有符號的,長度為系統字長度的整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
Q_ULONG & i )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個無符號的,長度為系統字長度的整數到i
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
float & f )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個使用標準IEEE754格式的32位浮點數到f
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
double & f )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個使用標準IEEE754格式的64位浮點數到f
並返迴流的引用。

QDataStream &

QDataStream::operator>> (
char *& s )

這是一個重載成員函數,提供了方便。它的行為基本上和上面的函數相同。

從流中讀取一個以“/0”結尾的字串到s
並返迴流的引用。

存放這個字串的空間是使用new
來分配的——調用者必須使用delete[]
來銷毀它。

QDataStream &

QDataStream::readBytes ( char *& s,
uint & l )

從流中讀取緩衝s
並返迴流的引用。

這個緩衝s
是使用new
來分配的。需要使用delete[]
來銷毀它。如果長度為0或者s

能被分配,s
就被設定為0。

l
參數將被設定為緩衝的長度。

序列化格式首先是一個Q_UINT32長度的說明符,然後是l
位元組的資料。注意資料不是
編碼的。

 

也可以參考readRawBytes()
和writeBytes()。

QDataStream &

QDataStream::readRawBytes ( char * s,
uint len )

從流中讀取len
位元組到s
並返迴流的引用。

這個緩衝s
必須被預先分配。資料不是
編碼的。

 

也可以參考readBytes()、QIODevice::readBlock()
和writeRawBytes()。

void
QDataStream::setByteOrder
( int bo )

設定序列化位元組順序為bo

bo
參數可以是QDataStream::BigEndian或QDataStream::LittleEndian。

預設設定是高位元組在前。我們強烈建議你保留這個設定,除非你有特殊需要。

 

也可以參考byteOrder()。

void
QDataStream::setDevice (
QIODevice * d
)

設定IO裝置為d

也可以參考device()
和unsetDevice()。

void
QDataStream::setPrintableData
( bool enable )

設定(如果enable
為真)或者清空可列印資料標記。

如果這個標記被設定,寫函數將產生由可列印字元(7位ASCII碼)的輸出。

我們建議只有在調試的情況下開啟可列印資料設定(它比較慢並且產生了更多的輸出)。

void
QDataStream::setVersion
( int v )

設定資料序列化格式的版本號碼。

如果你只使用目前的版本的Qt,你不需要設定這個版本號碼。

為了提供新的功能,在一些Qt的版本中,一些Qt類的資料流序列化格式變化了。如果你想讀較早版本Qt中建立的資料,或者寫可供較早版本Qt編譯的程式能
夠讀的資料,請使用這個函數來設定QDataStream的序列化格式。

 

  • 為了相容Qt 3.0,請使用v
    == 4。
  • 為了相容Qt 2.1.x和Qt 2.2.x,請使用v
    == 3。
  • 為了相容Qt 2.0.x,請使用v
    == 2。
  • 為了相容Qt 1.x,請使用v
    == 1。

 

也可以參考version().

void
QDataStream::unsetDevice
()

清除IO裝置。這個和調用setDevice(
0 )一樣。

也可以參考device()
和setDevice()。

int
QDataStream::version ()
const

返回資料序列化格式的版本號碼。
在Qt 3.0中,這個版本號碼為4。

也可以參考setVersion()。

QDataStream &

QDataStream::writeBytes ( const char * s,
uint len )

寫長度說明符len
和緩衝s
到流中並返迴流的引用。

len
被序列化為一個Q_UINT32,接著的是s
中的len
位元組。注意資料

編碼的。

 

也可以參考writeRawBytes()
和readBytes()。

QDataStream &

QDataStream::writeRawBytes (
const char * s, uint len )

s
中寫len
位元組到流中並且返迴流的引用。資料不是
編碼的。

 

也可以參考writeBytes()、QIODevice::writeBlock()
和readRawBytes()。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.