2012-06-14 130 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; 
} 
相關問題