2013-03-18 2 views
3

과 리틀 엔디안을 quint32 :Qt는 내가 다음과 같은 리틀 - 엔디안 ARM 시스템에 QByteArray에서 quint32 배열을 채울 QDatastream을 사용하고 QDataStream

// Modify the header 
    QByteArray header = QByteArray::fromRawData((const char*)dataPtr,HEADER_SIZE); 
    QDataStream dataStream(header); 
    dataStream.setByteOrder(QDataStream::LittleEndian); 
    quint32 headerBuffer[NUMBER_HEADER_ENTRIES]; 
    int bufferCnt = 0; 
    while (!dataStream.atEnd()) { 

     // Pop off a 32 bit int 
     quint32 temp; 
     dataStream >> temp; 

     // insert into buffer 
     headerBuffer[bufferCnt] = temp; 

     // Increment counter 
     bufferCnt++; 

    } 

문제는 바이트 순서로입니다. headerBuffer [113]에서 32 비트 필드의 마지막 4 비트를 가져와야하므로 0xf로 headerBuffer에 해당 항목을 넣으려고했습니다. 이 필드에 대해 확인할 예상 값은 "3"입니다. 그러나이 AND 연산은 아래에 표시된 것처럼 "a"를 제공합니다. 항목이 "0x1a13 & 0x000f"이되도록 바이트를 스왑하면 "3"이됩니다. 예상되는 값에 대한 몇 가지 다른 예와 내가 보는 것에 대해 아래에서 볼 수 있습니다. 그래서, 나는 QDataStream의 ByteOrder를 LittleEndian으로 설정하고 있지만 여전히 원하는 결과를 얻지 못하고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 0x131a 대신 0x1a13을 어떻게 얻을 수 있습니까? 감사!

 qDebug() << "ONE: " << QString("%1").arg(headerBuffer[0], 0, 16); // This prints: 494d0152 -- Should be: 4d495201 
     qDebug() << "TWO: " << QString("%1").arg(headerBuffer[1], 0, 16); // This prints: 5400 -- Should be: 54 
     qDebug() << "THREE: " << QString("%1").arg(headerBuffer[113] & 0x000f, 0, 16); // This prints: a -- Should be: 3 (headerBuffer[113] is always 0x131a) 
     qDebug() << "FOUR: " << QString("%1").arg(0x1a13 & 0x000f, 0, 16); // This prints: 3 -- Should be: 3 

답변

5

바이트 배열이 바이트 배열에서 약간 비정상 인 것처럼 보입니다. 나는. 그것은 빅 엔디안 단어로 묶이지 만 로우 엔디안 단어 순서로 묶여 있습니다. 당신은 LE 형태로 494d0152을 받고있는 경우

, 배열의 바이트 순서는 다음과 같습니다

52 01 4d 49 

당신이 4d 49 52 01를 기대하고 그것을 명확의 '낮은'단어가 4d 49는 BE 순서에입니다. 높은 단어와 동일합니다.

그래서 당신은 당신의 코드를 수정하려고 할 수 있습니다

QDataStream dataStream(header); 
dataStream.setByteOrder(QDataStream::BigEndian); 
... 
quint16 low, high; 
quint32 temp; 
dataStream >> low >> high; 
temp = (high << 32) | low; 
+0

최고 -이 주셔서 감사합니다, 그것은 내 문제를 해결했다. – PhilBot