2012-01-05 1 views
1

이 함수는 일부 입력에서는 올바르게 작동하지 않으므로 실수가 무엇입니까? 여기QBitArray를 QByteArray로 변환

모든 프로젝트 코드 : link

추신 : 난 내가는 비트가 왼쪽으로 이동해야한다 어쩌면 생각 제로

QByteArray bitsToBytes(QBitArray bits) { 
    QByteArray bytes; 
    bytes.resize(bits.count()/8); 

    // Convert from QBitArray to QByteArray 
    for(int b=0; b<bits.count(); ++b) 
    bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8))); 

    return bytes; 
} 
+0

먼저 무엇을 얻고 싶습니까? 샘플 입출력을 제공 할 수 있습니까? 그러면 코드가 거의 정확 해 보입니다. 유일한 조언 : 다음과 같이 변수를 사용하기 전에 변수를 초기화하는 것을 잊지 마십시오 :'bytes.fill (0);' – Lol4t0

답변

1

Topro 알고리즘은 전체적으로 정확해야합니다. 하지만 내 콘서트는 시험으로 bits[b]?1:0입니다.

기본적으로 operator[] (int i)은 "인덱스 위치 i의 비트를 수정 가능 참조"로 반환하고 operator[] (int i) const은 부울을 반환합니다. 첫 번째 정의가 chozen 인 경우 참 조가 참인지 테스트합니다.

bits.testBit(b)으로 Topro 알고리즘을 사용해보십시오.

1

입력이 "bits.size() % 8"동일을 사용하고 있습니다 (7 - (b % 8)) 비트

나는 이것을 시도하고 예상되는 결과를 얻었다.

QBitArray bits; 
QByteArray bytes; 

bits.resize(12); 
bits.fill(true); 

bits.setBit(2,false); 

bytes.resize((bits.count() - 1)/8 + 1); 

for(int b=0; b<bits.count(); ++b) 
    bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(7-(b%8)))); 

for (int b=0;b<bytes.size();b++) 
    printf("%d\n",(quint8)bytes.at(b)); 
+1

시도해 보았지만 작동하지 않습니다. – sivanzor

0

(bits.count() % 8)! = 0, 9 그런 다음 bytes.resize(bits.count()/8);이 잘못된 결과를 반환합니다.

의견에서 Topro가 제안한대로 bytes.resize((bits.count() - 1)/8 + 1))을 사용할 수 있습니다.

+0

@Topro : 그는 비트 OR을하고 있습니다; 비트가 설정되는 순서는 중요하지 않습니다. –

+0

예,'''((bits.count() - 1)/8 + 1)''' – Topro

+0

사실 내 문제는 모든 데이터에 있습니다. 마지막 바이트 – sivanzor