2009-06-02 3 views
3

저는 대학을위한 작은 프로젝트를 진행하고 있습니다. 네트워크를 통한 전송을 모델링하고 여러 종류의 오류 수정 알고리즘을 적용하고 시각화해야합니다. 내 improvized 패킷은 하나 quint8로 구성되어 있습니다 : QBitArray 같은 비트 배열로 변환 할 필요가 체크 비트를 추가 할 UDP를 통해 전송, 검사 비트 전송 성공 확인 및 밖으로 quint8 구성 . 다시 한번, 그것은 실제하지만 교육 일이 아니다, 그래서 CRC와 같은 실제 algoriths를 사용하는 저를하지 않는 것이 좋습니다 ...C++ Qt : 비트 단위 연산

그래서 제 질문은 : 이 어떻게 (quint8이 경우) 모든 데이터 유형을 변환합니까 QBitArray에? 컴퓨터의 모든 데이터가 비트 배열임을 의미하지만 어떻게 액세스해야합니까?

감사합니다. Dmitri.

답변

5

은 우리가 올바른

template < class T > 
static QBitArray toQBit (const T &obj) { 
    int const bitsInByte= 8; 
    int const bytsInObject= sizeof(T); 

    const quint8 *data = static_cast<const quint8*>(&obj) ; 
    QBitArray result(bytsInObject*bitsInByte); 
    for (int byte=0; byte<bytsInObject ; ++byte) { 
     for (int bit=0; bit<bitsInByte; ++bit) { 
      result.setBit (byte*bitsInByte + bit, data[byte] & (1<<bit)) ; 
     } 
    } 
    return result; 
} 

void Foo() { 
    Bar b ; 
    QBitArray qb = toQBit (b) ; 
} 
+0

고마워, 내가 원한거야. 줄 6의 입력 오류 : qint8 대신 5 줄을 입력하십시오. – Dmitri

+0

환영합니다, 오타가 수정되었습니다. – TimW

1

qint8은 실제로 서명 된 문자입니다. 따라서 obj를 char 배열로 처리 할 수 ​​있습니다.

template < class T > 
QBitArray toQBit (T &obj) { 
    int len = sizeof(obj) * 8 ; 
    qint8 *data = (qint8*)(&obj) ; 
    QBitArray result ; 
    for (int i=0; i< sizeof(data); ++i) { 
     for (int j=0; j<8; ++j) { 
      result.setBit (i*8 + j, data[i] & (1<<j)) ; 
     } 
    } 
    return result; 
} 

void Foo() { 
    Bar b ; 
    QBitArray qb = toQBit (b) ; 
} 
+0

프로그램이 중단됩니다. 코드에 적어도 2 개의 버그가 있습니다. – TimW

0

내가 템플릿 함수를 선언하고 UINT8하는 인수를 주조의 어느 지점이 표시되지 않는 얻을 수 있는지 확인 할 수 있습니다. 서명되지 않은 긴

#include <bitset> 
template <typename T> 
QBitArray toQBit(T val) { 
    std::bitset<sizeof(T) * 8> bs(val); 
    QBitArray result(bs.size()); 
    for (int ii = 0; ii < bs.size(); ++ii) { 
     result.setBit(ii, bs.test(ii)); 
    } 
    return result; 
} 

로 승격 할 수 있습니다 유형 솔루션은 일반적으로 비트 배열에 모든 데이터 유형을 변환 할 수있는 방법이 없습니다. 특히 데이터 유형에 포인터가 포함되어있는 경우 포인터가 아닌 pointee를 전송하려고합니다. 따라서 어떤 복잡한 유형도 별도로 다루어야합니다. 그리고 다른 아키텍처에서 다른 엔디안 (리틀 엔디안과 빅 엔디안)에 대해 알고 있어야합니다. std :: bitset이이 문제에 따라 안전하다고 생각하지만, 예를 들어 구조체의 char 배열에 포인터를 캐스팅하고 비트를 저장하는 것이 안전하지 않을 수 있습니다.