Qt QByteArrays + 16位无符号整数

时间:2012-06-14 14:15:47

标签: qt kinect

我正在使用Kinect传感器的深度数据,这是一个16位无符号整数数组。为了摆脱一些残缺的信息,我需要将一个像素的内容向左移位。我收到的结果太小了,很奇怪(例如,打印出来的数字应该是~400,因为它是以毫米为单位的距离,但我得到数字0-30)。

castedBuffer = (uchar*)internalFrameArray->constData();
std::cout << (int)((unsigned short int)castedBuffer[307000]>>3) << "\n";

我很挣扎,因为我以(uchar *)格式(8位)获取数据,而我的理论是位移仅应用于16位数的一半。

我有点迷失了!

2 个答案:

答案 0 :(得分:1)

根据Mat的评论,castedBuffer[307000]unsigned char。如果您希望从castedBuffer中获取16位值,则需要同时访问castedBuffer[306999]castedBuffer[307000],假设该值为big-endian编码(请参阅{{ 3}})。

这是一个关于如何从数组中提取16位值的大端示例(假设您需要3位左移):

castedBuffer = reinterpret_cast<unsigned char*>(internalFrameArray->data());
unsigned short int extractedValue = static_cast<unsigned short int>(
                                       ((castedBuffer[306999] << 5) & 0xff60) |
                                        (castedBuffer[307000] >> 3));

答案 1 :(得分:1)

Qt有一个QDataStream类,它正是你想要的:字节顺序转换和从QByteArray中提取任意宽度的整数。这是如何做到的:

#include <QtCore/QByteArray>
#include <QtCore/QDataStream>
#include <QtCore/QDebug>

void test(QByteArray internalFrameArray)
{
  QDataStream str(&internalFrameArray);
  str.setByteOrder(QDataStream::LittleEndian);
  // the above must match endianness in the Kinect data stream
  str.skipRawData(306999);
  quint16 val;
  str >> val;
  qDebug() << val>>3;  
}