我想了解如何在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)
他们是不同的。
答案 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)
import struct
with open('file.bin', 'rb') as f:
unsigned_shorts = struct.iter_unpack('H', f.read())
print(list(unsigned_shorts))
示例输出:
>>>[(1,), (2,), (3,)]