C++ QDataStream赢得’;无法使用定制的字符数组

C++ QDataStream赢得’;无法使用定制的字符数组,c++,qt,serialization,C++,Qt,Serialization,我有一个由两个主要模块组成的应用程序。一个是用C编写的,使用标准的C运行库,一个是用Qt C++编写的。它们通过IPC相互通信。C模块创建一个字符数组,用数据填充它并发送到用Qt编写的模块。我想使用QDataStream反序列化接收到的数据,但我的努力还没有产生任何结果。下面是一个我试图实现的简单示例: unsigned int pointer = 0; const int IPC_MSG_LEN = 500; const int IPC_MSG_HEADER = 200; const int

我有一个由两个主要模块组成的应用程序。一个是用C编写的,使用标准的C运行库,一个是用Qt C++编写的。它们通过IPC相互通信。C模块创建一个字符数组,用数据填充它并发送到用Qt编写的模块。我想使用QDataStream反序列化接收到的数据,但我的努力还没有产生任何结果。下面是一个我试图实现的简单示例:

unsigned int pointer = 0;
const int IPC_MSG_LEN = 500;
const int IPC_MSG_HEADER = 200;
const int SOMETHING = 1443;
char api = 55;

char msg[IPC_MSG_LEN] = {0};
memcpy_s(msg, IPC_MSG_LEN, &IPC_MSG_HEADER, sizeof(int));
pointer = sizeof(unsigned int);
memcpy_s(&msg[pointer], IPC_MSG_LEN - pointer, &api, sizeof(char));
++pointer;
memcpy_s(&msg[pointer], IPC_MSG_LEN - pointer, &SOMETHING, sizeof(int));

QByteArray arr(msg, IPC_MSG_LEN);
QDataStream ds(&arr, QIODevice::ReadOnly);
qint32 header = 0, aa = 0;
qint8 t_api = 0;
ds >> header; //Doesn't work
ds >> t_api; //Works
ds >> aa; //Doesn't work
如您所见,代码非常简单,但是header和aa变量被反序列化为随机数。但是,t_api(单字节变量)已分配正确的值。 那么这个代码有什么问题?QDataStream是否使用与我正在使用的数据格式不兼容的私有数据格式?我应该编写自己的QIODevice实现,还是有一个我不知道的快速修复方法?:) 谢谢,谢谢你的帮助

更新


非常感谢各位,您的解决方案与这些原始数据类型完美结合,但问题是我还需要能够序列化/反序列化char*字符串

wchar_t* name1 = L"something";
memcpy_s(&msg[pointer], IPC_MSG_LEN - pointer, name1, (wcslen(name1) + 1) * 2);

char* ai = new char[500];
ds >> ai; //ai becomes NULL here :|

有没有办法做到这一点?再次感谢

QDataStream
默认情况下以big-endian格式存储数字。
您可以通过以下方式进行更改:

ds.setByteOrder(QDataStream::ByteOrder(QSysInfo::ByteOrder));

它将使用检测到的主机端号。

QDataStream
默认情况下以大端号格式存储数字。
QDataStream::setByteOrder(QDataStream::LittleEndian);

您可以通过以下方式进行更改:

ds.setByteOrder(QDataStream::ByteOrder(QSysInfo::ByteOrder));
它将使用检测到的主机端性

QDataStream::setByteOrder(QDataStream::LittleEndian);

它是一个
wchar\u t*
字符串

wchar\u t
的大小因编译器而异-每个wchar\u t有4或2个字节。这对IPC来说意味着一个问题。与
wchar\u t
不同,
char
保证为1字节大。 因此,要么将整个字符串编码为UTF8(或者使用8位编码字符串和已知的代码页/编码),然后将其作为原始数据写入:

然后使用
QString::fromUtf8
对其进行解码(或者如果您决定使用其他8位编码而不是utf8,则使用
QTextCodec
)。或者如果您可以确保您的
wchar\u t*
字符串符合UTF16并且
sizeof(wchar\u t)==2
,则将其转储

顺便说一句,如果我是你,我会避免记忆。它不是C++标准的一部分,这是避免它的一个很好的理由。
我想要的是从QDataStream读取wchar\u t*/char*,直到流位置变为null终止字符

如果这是作业,请相应地标记您的帖子

其中一个应该有效:

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){
矢量原始数据;
ushort tmp;
做{
流>>tmp;
rawData.push_back(tmp)
}while(tmp);
返回QString::fromUtf16(rawData.data());
}

QString readWcharString(QDataStream&stream){
矢量原始数据;
ushort tmp;
做{
流>>tmp;
rawData.push_back(tmp)
}while(tmp);
返回QString::fromWCharArray(rawData.data());
}

它是一个
wchar\u t*
字符串

wchar\u t
的大小因编译器而异-每个wchar\u t有4或2个字节。这对IPC来说意味着一个问题。与
wchar\u t
不同,
char
保证为1字节大。 因此,要么将整个字符串编码为UTF8(或者使用8位编码字符串和已知的代码页/编码),然后将其作为原始数据写入:

然后使用
QString::fromUtf8
对其进行解码(或者如果您决定使用其他8位编码而不是utf8,则使用
QTextCodec
)。或者如果您可以确保您的
wchar\u t*
字符串符合UTF16并且
sizeof(wchar\u t)==2
,则将其转储

顺便说一句,如果我是你,我会避免记忆。它不是C++标准的一部分,这是避免它的一个很好的理由。
我想要的是从QDataStream读取wchar\u t*/char*,直到流位置变为null终止字符

如果这是作业,请相应地标记您的帖子

其中一个应该有效:

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){
矢量原始数据;
ushort tmp;
做{
流>>tmp;
rawData.push_back(tmp)
}while(tmp);
返回QString::fromUtf16(rawData.data());
}

QString readWcharString(QDataStream&stream){
矢量原始数据;
ushort tmp;
做{
流>>tmp;
rawData.push_back(tmp)
}while(tmp);
返回QString::fromWCharArray(rawData.data());
}

您好,谢谢您的支持。请看我的最新帖子。嗨,谢谢你的支持。请看我的最新帖子。嗨,谢谢你的支持。请看我的最新帖子。谢谢,但我不明白你的回答对我的情况有什么帮助。我知道wchar_t和char之间的区别,我只想从QDataStream读取wchar_t*/char*,直到流位置到达空终止字符,但我猜这不是QDataStream的默认行为,对吗?@Davita:修改“发送方”以QDataStream兼容格式转储数据,或者修改接收方以读取数据使用QDataStream的“非标准”数据。使用>>从QDataStream读取wchar_t字符,直到得到==0的字符为止,这是“家庭作业”困难和困难在于添加一个有5行代码的子程序。那么问题出在哪里呢?嗨,谢谢你的支持。请看我的最新帖子。谢谢,但我不明白你的回答对我的情况有什么帮助。我知道wchar_t和char之间的区别,我只想从QDataStream读取wchar_t*/char*,直到流位置到达空终止字符,但我猜这不是QDataStream的默认行为,对吗?@Davita:修改“发送方”以QDataStream兼容格式转储数据,或者修改接收方以读取数据使用QDataStream读取wchar\u t charac的“非标准”数据
QString readWcharString(QDataStream& stream){
    QVector<wchar_t> rawData;
    ushort tmp;
    do{
        stream >> tmp;
        rawData.push_back(tmp)
    }while(tmp);
    return QString::fromWCharArray(rawData.data());
}