2014-11-10 4 views
1

QVector<double>QBytearray으로 변환하고 싶습니다.이 작업을 수행하는 방법에 대해서는 알지 못합니다. 이 시도하지만, 프로그램 충돌 :Qvector <double>을 QBytearray로 변환하는 방법

QVector<double> vec; 
QByteArray arr = QByteArray::fromRawData(reinterpret_cast<const char*>(vec),vec.size()); 
for(int i = 0; i< vec.size(); i++) 
    arr.append(reinterpret_cast<const char*>(vec.data(&numberOfData),sizeof(double)); 

는 사람이 얼마나 제대로 수행하는 방법을 말해 줄래?

+3

먼저 당신이'QByteArray'에 포함 할 작업을 지정해야합니다. 단순히 벡터의 원시 이진 데이터? – Angew

+2

http://stackoverflow.com/questions/22479986/convert-from-qbytearray-to-array-of-double –

+0

@Angew 무엇을 의미합니까? 다음으로 Qbytearray를 사용하여 그림을 표시합니다. –

답변

1

QByteArray가 일련의 연속 바이트를 수신 할 수 있도록 네이티브 배열을 통과해야합니다.

double *bytes = new double[vec.size()]; 
for (int i = 0; i < vec.size(); ++i) { 
    bytes[i] = vec[i]; 
} 
QByteArray array = QByteArray::fromRawData(reinterpret_cast<void*>(bytes)); 
delete []bytes; 

면책 조항 : 테스트되지 않은 코드.

--- 업데이트 ---

leemes가 제대로 지적한 바와 같이, 당신은 할당하고 바이트 배열을 복사 할 필요가 없습니다은 QVector 이미 원시 데이터에 대한 두 개의 액세스 기능을 제공합니다. 그래서 당신은 단순히 data()와 constData()를 사용할 수 있습니다. 그의 답변을 참조하십시오.

+2

왜 vec.data()가 이미 제공 한 경우 벡터를 원시 배열로 복사합니까? 너 정확히 그 포인터? – leemes

+1

오른쪽. Data() 및 constData()를 잊어 버렸습니다. 거의 사용하지 않습니다. – HappyCactus

7

QVector::constData을 사용하면 벡터에 포함 된 (const) 원시 데이터에 대한 포인터를 얻을 수 있습니다. 그러나 크기를 하나의 항목 크기 (예 : sizeof(double))로 곱해야합니다. 나중에 코드처럼 루프가 필요하지 않습니다.

QByteArray data = QByteArray::fromRawData(
     reinterpret_cast<const char*>(vec.constData()), 
     sizeof(double) * vec.size() 
    ); 

당신은 또한 잠재적 byte ordering issues을 담당 훨씬 청소기 코드의 결과로, 변환을 수행하는 QDataStream를 사용할 수 있습니다.

QByteArray data; 
QDataStream stream(&data, QIODevice::WriteOnly); 
for (auto x : vec) 
    stream << x; 
0

오늘이 변환도 간단하다 :

QVector<double> vec; 
// populate vector 
QByteArray data; 
QDataStream stream(&data, QIODevice::WriteOnly); 
stream << vec;