【发布时间】:2018-06-13 18:32:48
【问题描述】:
我正在将 .jpg 图像从 Qt 客户端发送到 python 服务器。 Qt客户端发送如下:
void Sender::sendToServer(QByteArray imageData)
{
QDataStream stream(serverSocket);
int t = imageData.size();
stream << t;
stream << imageData;
serverSocket->waitForBytesWritten(-1);
qDebug() << "Frame size:" << imageData.size();
}
而服务器是:
unpacker = struct.Struct('!i')
conn, addr = s.accept()
bool = True
data = b''
while True:
while len(data) < 4:
try:
data += conn.recv(100)
except:
break
img_size = unpacker.unpack(data[:4])[0]
print('size: ', img_size)
print('Data: ',data)
print('Image: ',data[:8]) # deleting preceding 8 bytes
# image processing
输出是:
//Client:
Frame size: 49993
//Server:
size: 49993
Data: b'\x00\x00\xc3\r\x00\x00\xc3\r\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01...
Image: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00...
在输出中,.jpg 文件从 '\xff\xd8' 开始。由于 C++ int 是 4 字节,服务器需要“{4 byte}\xff\xd8...”。但是,前面的字节总是不同的大小。有时是 8 个字节,但有时甚至不同(例如 6 或 9 个字节)。我无法弄清楚它背后的原因。这里有什么问题?
平台:win7、Qt 5.9.1、Python 3.4。
编辑
根据@Frank 的回答,我将代码更改如下,一切正常:
Qt客户端发送方法:
void Sender::sendToServer(QByteArray imageData)
{
QDataStream stream(serverSocket);
QString size = QString::number(data.size());
QString size_8_byte = size.rightJustified(8, ' '); // add spaces to make it exactly 8 bytes
imageData.prepend(size_8_byte.toUtf8());
stream.writeRawData((char*)(imageData.data()), imageData.size());
serverSocket->waitForBytesWritten(-1);
}
Python 服务器:
unpacker = struct.Struct('8s')
conn, addr = s.accept()
data = b''
bool = True
while True:
while len(data) < 8:
try:
data += conn.recv(100)
except:
break
img_size = unpacker.unpack(data[:8])[0]
img_size = int(img_size.decode("utf-8").strip()) #remove spaces and convert to int
data = data[8:] #correct data
#image processing
【问题讨论】:
-
不是 100% 确定,但 QDataStream 不对数据执行某种形式的编码吗?也许使用
QDataStream::writeRawData()会更好地满足您的需求。 -
补充@Frank 所说的,
QDataStream不仅有自己的数据格式,而且在 Qt 版本之间甚至不一致(如文档中所述)。 -
@Frank,这成功了。写下来回答,我会接受的。谢谢!
标签: python c++ qt sockets qdatastream