如何使用Python读取unsigned短裤?

时间:2017-07-10 09:16:31

标签: python c++ qt numpy

主要问题

我想了解如何在Python中读取C ++ unsigned short。我试图使用np.fromfile('file.bin',np.uint16),但似乎它不起作用。请将此作为主要问题。

案例研究:

进行更多比赛 我使用C ++和unsigned shorts QT方法将QDataStream数组导出为二进制文件。

部首:

QVector<unsigned short> rawData;

的main.cpp

QFile rawFile(QString("file.bin"));
rawFile.open(QIODevice::Truncate | QIODevice::ReadWrite);
QDataStream rawOut(&rawFile);
rawOut.writeRawData((char *) &rawData, 2*rawData.size());
rawFile.close();

我试图用Python和numpy来阅读它,但我找不到如何阅读无符号短裤。从literature无符号短路应该是2个字节,因此我尝试使用以下方法读取它:

import numpy as np
np.readfromfile('file.bin',np.uint16)

但是,如果我将一个unsigned_value与python进行比较,并在C ++中使用prining作为字符串进行比较:

Qstring single_value = QString::number(unsigned_value)

他们是不同的。

3 个答案:

答案 0 :(得分:1)

rawOut.writeRawData((char *) &rawData, 2*rawData.size());正在您的文件中写入大量垃圾。正如您尝试的那样,QVector无法直接转换为short数组。

使用以下代码编写数据

for(const auto& singleVal : rawData)
rawOut << singleVal;

答案 1 :(得分:1)

我试验结束。试试'<u2''>u2'

https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

'>'颠倒了2个字节的顺序

In [674]: np.array(123, np.dtype('>u2')).tostring()
Out[674]: b'\x00{'
In [675]: np.array(123, np.dtype('<u2')).tostring()
Out[675]: b'{\x00'
In [678]: np.array(123, np.uint16).tostring()
Out[678]: b'{\x00'

答案 2 :(得分:0)

查看struct module

import struct

with open('file.bin', 'rb') as f:
    unsigned_shorts = struct.iter_unpack('H', f.read())
    print(list(unsigned_shorts))

示例输出:

>>>[(1,), (2,), (3,)]