2012-06-14 91 views
0

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

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

我很努力,因为我得到的数据列于(UCHAR *)格式(这是8位),我的理论是,移位只被应用到16位数字的一半。

我有点失落!

+0

'castedBuffer [307000]'是一个'uchar',将它转换为更宽的类型将不会读取阵列中的更多数据。 – Mat

回答

1

根据Mat的评论,castedBuffer[307000]unsigned char。如果要从castedBuffer中获取16位值,则假设该值为大端编码(请参阅http://en.wikipedia.org/wiki/Endianness),则需要同时访问castedBuffer[306999]castedBuffer[307000]

这里是你将如何提取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

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; 
} 
相关问题