QDataStream::setByteOrder(QDataStream::LittleEndian);
#include <QDebug>
#include <QByteArray>
#include <QDataStream>
#include <QString>
#include <vector>
template<typename T> void writePtr(char*&dst, T data){
*reinterpret_cast<T*>(dst) = data;
dst += sizeof(T);
}
int main(int argc, char** argv){
const size_t ipcSize = 512;
std::vector<char> buffer(ipcSize, 0);
quint32 sendVal1 = 0x12345678, recvVal1 = 0;
quint8 sendVal2 = 0xee, recvVal2 = 0;
quint32 sendVal3 = 0x9999abcd, recvVal3 = 0;
char* dst = &buffer[0];
writePtr(dst, sendVal1);
writePtr(dst, sendVal2);
writePtr(dst, sendVal3);
QByteArray byteArray(&buffer[0]);
QDataStream stream(&byteArray, QIODevice::ReadOnly);
stream.setByteOrder(QDataStream::LittleEndian);
stream >> recvVal1 >> recvVal2 >> recvVal3;
qDebug() << QString(QObject::tr("sent: %1, received: %2")).arg(sendVal1, 8, 16).arg (recvVal1, 8, 16);
qDebug() << QString(QObject::tr("sent: %1, received: %2")).arg(sendVal2, 2, 16).arg(recvVal2, 2, 16);
qDebug() << QString(QObject::tr("sent: %1, received: %2")).arg(sendVal3, 8, 16).arg(recvVal3, 8, 16);
return 0;
}
но проблема в том, что мне также нужно иметь возможность сериализации / десериализации строк char *.
Сериализация данных Qtформат поясняется (подробно) здесь .Вы ДОЛЖНЫ прочитать этот документ, если хотите использовать QDataStream для IPC.У Qt хорошая документация , так что используйте ее.
Также это не строка char *:
wchar_t* name1 = L"something";
Это строка wchar_t*
.
wchar_t
имеет разный размер в зависимости от компилятора - 4 или 2 байта на wchar_t.Что означает проблему для IPC.в отличие от wchar_t
, char
гарантированно будет иметь размер 1 байт.Поэтому либо закодируйте всю строку в UTF8 (или используйте 8-битную строку с известной кодовой страницей / кодировкой) и запишите ее в виде необработанных данных в QByteArray-совместимый формат :
void writeDataPtr(char*& ptr, const char* data, quint32 size){
if (!data){
size = 0xffffffff;
writePtr(ptr, size);
return;
}
memcpy(ptr, data, size);
ptr += size;
}
Затем используйте QString::fromUtf8
для декодирования (или QTextCodec
- если вы решили использовать другую 8-битную кодировку вместо utf8).ИЛИ если , вы можете убедиться, что ваша строка wchar_t*
соответствует UTF16 и sizeof(wchar_t) == 2
, выгрузите ее в QString-совместимый формат .
Кстати - на вашем месте я бы избежал memcpy_s
.Это не является частью стандарта C ++, что является очень веской причиной, чтобы его избегать.
Я хочу прочитать wchar_t * / char * из QDataStream, пока позиция потока не достигнет нулевого завершающего символа.
Если это домашняя работа, пометьте свой пост соответствующим образом.
Один из них должен работать:
QString readWcharString(QDataStream& stream){
QVector<ushort> rawData;
ushort tmp;
do{
stream >> tmp;
rawData.push_back(tmp)
}while(tmp);
return QString::fromUtf16(rawData.data());
}
или
QString readWcharString(QDataStream& stream){
QVector<wchar_t> rawData;
ushort tmp;
do{
stream >> tmp;
rawData.push_back(tmp)
}while(tmp);
return QString::fromWCharArray(rawData.data());
}