📄 qdatastream.cpp
字号:
Reads an unsigned 32-bit integer from the stream and returns a reference to the stream.*//*! Reads a signed 32-bit integer from the stream and returns a reference to the stream.*/QDataStream &QDataStream::operator>>( Q_INT32 &i ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data i = read_int_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&i, sizeof(Q_INT32) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[4]; dev->readBlock( b, 4 ); *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this;}/*! \fn QDataStream &QDataStream::operator>>( Q_UINT64 &i ) Reads an unsigned 64-bit integer from the stream and returns a reference to the stream, or uses the Q_UINT32 operator if 64 bit is not available.*//*! Reads a signed 64-bit integer from the stream and returns a reference to the stream, or uses the Q_UINT32 operator if 64 bit is not available.*/QDataStream &QDataStream::operator>>( Q_INT64 &i ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data i = read_int_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&i, sizeof(Q_INT64) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[sizeof(Q_INT64)]; dev->readBlock( b, sizeof(Q_INT64) ); if ( sizeof(Q_INT64) == 8 ) { *p++ = b[7]; *p++ = b[6]; *p++ = b[5]; *p++ = b[4]; } *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this;}static double read_double_ascii( QDataStream *s ){ register int n = 0; char buf[80]; while ( TRUE ) { buf[n] = s->device()->getch(); if ( buf[n] == '\n' || n > 78 ) // $-terminator break; n++; } buf[n] = '\0'; return atof( buf );}/*! Reads a 32-bit floating point number from the stream using the standard IEEE754 format. Returns a reference to the stream.*/QDataStream &QDataStream::operator>>( float &f ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data f = (float)read_double_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&f, sizeof(float) ); } else { // swap bytes register uchar *p = (uchar *)(&f); char b[4]; dev->readBlock( b, 4 ); *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this;}/*! Reads a 64-bit floating point number from the stream using the standard IEEE754 format. Returns a reference to the stream.*/QDataStream &QDataStream::operator>>( double &f ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data f = read_double_ascii( this ); } else if ( noswap ) { // no conversion needed dev->readBlock( (char *)&f, sizeof(double) ); } else { // swap bytes register uchar *p = (uchar *)(&f); char b[8]; dev->readBlock( b, 8 ); *p++ = b[7]; *p++ = b[6]; *p++ = b[5]; *p++ = b[4]; *p++ = b[3]; *p++ = b[2]; *p++ = b[1]; *p = b[0]; } return *this;}/*! Reads the '\0'-terminated string \a s from the stream and returns a reference to the stream. Space for the string is allocated using \c new - the caller must eventually call delete[] on the value.*/QDataStream &QDataStream::operator>>( char *&s ){ uint len = 0; return readBytes( s, len );}/*! Reads the buffer \a s from the stream and returns a reference to the stream. The buffer \a s is allocated using \c new. Destroy it with the \c delete[] operator. If the length is zero or \a s cannot be allocated, \a s is set to 0. The \a l parameter will be set to the length of the buffer. The serialization format is an Q_UINT32 length specifier first, then the data (\a l bytes). \sa readRawBytes(), writeBytes()*/QDataStream &QDataStream::readBytes( char *&s, uint &l ){ CHECK_STREAM_PRECOND Q_UINT32 len; *this >> len; // first read length spec l = (uint)len; if ( len == 0 || eof() ) { s = 0; return *this; } else { s = new char[len]; // create char array CHECK_PTR( s ); if ( !s ) // no memory return *this; return readRawBytes( s, (uint)len ); }}/*! Reads \a len bytes from the stream into \a s and returns a reference to the stream. The buffer \a s must be preallocated. \sa readBytes(), QIODevice::readBlock(), writeRawBytes()*/QDataStream &QDataStream::readRawBytes( char *s, uint len ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data register Q_INT8 *p = (Q_INT8*)s; while ( len-- ) *this >> *p++; } else { // read data char array dev->readBlock( s, len ); } return *this;}/***************************************************************************** QDataStream write functions *****************************************************************************//*! \fn QDataStream &QDataStream::operator<<( Q_UINT8 i ) Writes an unsigned byte to the stream and returns a reference to the stream.*//*! Writes a signed byte to the stream.*/QDataStream &QDataStream::operator<<( Q_INT8 i ){ CHECK_STREAM_PRECOND if ( printable && (i == '\\' || !isprint(i)) ) { char buf[6]; // write octal code buf[0] = '\\'; buf[1] = '0' + ((i >> 6) & 0x07); buf[2] = '0' + ((i >> 3) & 0x07); buf[3] = '0' + (i & 0x07); buf[4] = '\0'; dev->writeBlock( buf, 4 ); } else { dev->putch( i ); } return *this;}/*! \fn QDataStream &QDataStream::operator<<( Q_UINT16 i ) Writes an unsigned 16-bit integer to the stream and returns a reference to the stream.*//*! Writes a signed 16-bit integer to the stream and returns a reference to the stream.*/QDataStream &QDataStream::operator<<( Q_INT16 i ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[16]; sprintf( buf, "%d\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_INT16) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[2]; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 2 ); } return *this;}/*! \fn QDataStream &QDataStream::operator<<( Q_UINT32 i ) Writes an unsigned 32-bit integer to the stream and returns a reference to the stream.*//*! Writes a signed 32-bit integer to the stream and returns a reference to the stream.*/QDataStream &QDataStream::operator<<( Q_INT32 i ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[16]; sprintf( buf, "%d\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_INT32) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[4]; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 4 ); } return *this;}/*! \fn QDataStream &QDataStream::operator<<( Q_UINT64 i ) Writes an unsigned 64-bit integer to the stream and returns a reference to the stream, or uses the Q_UINT32-operator if 64 bit is not available.*//*! Writes a signed 64-bit integer to the stream and returns a reference to the stream, or calls the Q_INT32-operator if 64 bit is not available.*/QDataStream &QDataStream::operator<<( Q_INT64 i ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[20]; sprintf( buf, "%ld\n", i ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&i, sizeof(Q_INT64) ); } else { // swap bytes register uchar *p = (uchar *)(&i); char b[sizeof(Q_INT64)]; if ( sizeof(Q_INT64) == 8 ) { b[7] = *p++; b[6] = *p++; b[5] = *p++; b[4] = *p++; } b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, sizeof(Q_INT64) ); } return *this;}/*! \fn QDataStream &QDataStream::operator<<( uint i ) Writes an unsigned integer to the stream as a 32-bit unsigned integer (Q_UINT32). Returns a reference to the stream.*//*! \fn QDataStream &QDataStream::operator<<( int i ) Writes a signed integer to the stream as a 32-bit signed integer (Q_INT32). Returns a reference to the stream.*//*! Writes a 32-bit floating point number to the stream using the standard IEEE754 format. Returns a reference to the stream.*/QDataStream &QDataStream::operator<<( float f ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[32]; sprintf( buf, "%g\n", (double)f ); dev->writeBlock( buf, strlen(buf) ); } else { float g = f; // fixes float-on-stack problem if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&g, sizeof(float) ); } else { // swap bytes register uchar *p = (uchar *)(&g); char b[4]; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 4 ); } } return *this;}/*! Writes a 64-bit floating point number to the stream using the standard IEEE754 format. Returns a reference to the stream.*/QDataStream &QDataStream::operator<<( double f ){ CHECK_STREAM_PRECOND if ( printable ) { // printable data char buf[32]; sprintf( buf, "%g\n", f ); dev->writeBlock( buf, strlen(buf) ); } else if ( noswap ) { // no conversion needed dev->writeBlock( (char *)&f, sizeof(double) ); } else { // swap bytes register uchar *p = (uchar *)(&f); char b[8]; b[7] = *p++; b[6] = *p++; b[5] = *p++; b[4] = *p++; b[3] = *p++; b[2] = *p++; b[1] = *p++; b[0] = *p; dev->writeBlock( b, 8 ); } return *this;}/*! Writes the '\0'-terminated string \a s to the stream and returns a reference to the stream. The string is serialized using writeBytes().*/QDataStream &QDataStream::operator<<( const char *s ){ if ( !s ) { *this << (Q_UINT32)0; return *this; } uint len = qstrlen( s ) + 1; // also write null terminator *this << (Q_UINT32)len; // write length specifier return writeRawBytes( s, len );}/*! Writes the length specifier \a len and the buffer \a s to the stream and returns a reference to the stream. The \a len is serialized as an Q_UINT32, followed by \a len bytes from \a s. \sa writeRawBytes(), readBytes()*/QDataStream &QDataStream::writeBytes(const char *s, uint len){ CHECK_STREAM_PRECOND *this << (Q_UINT32)len; // write length specifier if ( len ) writeRawBytes( s, len ); return *this;}/*! Writes \a len bytes from \a s to the stream and returns a reference to the stream. \sa writeBytes(), QIODevice::writeBlock(), readRawBytes()*/QDataStream &QDataStream::writeRawBytes( const char *s, uint len ){ CHECK_STREAM_PRECOND if ( printable ) { // write printable register char *p = (char *)s; while ( len-- ) *this << *p++; } else { // write data char array dev->writeBlock( s, len ); } return *this;}#endif // QT_NO_DATASTREAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -