2014-01-28 2 views
5

나는이 코드를 사용하여 std::vector<unsigned char>QByteArray을 변환하려고 : byteArrayBuffer 데이터로 채워진 QByteArray라고 가정하면,수 std :: 벡터를 QByteArray 변환 <서명 숯불>

unsigned char* buffer = (unsigned char*)byteArrayBuffer.constData(); 
std::vector<unsigned char>::size_type size = strlen((const char*)buffer); 
std::vector<unsigned char> bufferToCompress(buffer, buffer + size); 

하지만를, 나는 그것을하지 않는 생각 byteArrayBuffer.size()bufferToCompress.size()과 다른 값을 반환하기 때문에 라인 unsigned char* buffer = (unsigned char*)byteArrayBuffer.constData();에서 제대로 작동합니다.

어떻게 작동시킬 수 있습니까?

답변

14

나는 Qt는 익숙하지 않다, 그러나 확실하게 당신은

std::vector<unsigned char> bufferToCompress(
    byteArrayBuffer.begin(), byteArrayBuffer.end()); 

참고합니다 : strlen은 C++에서 특히 유용하지 않다; 그것은 C 스타일의 널 종료 문자열의 길이를 알려줍니다 (0 값 바이트를 찾거나 접근 가능한 메모리와 크래시의 끝에서 찾을 때까지 메모리를 검색 함). 그러나 크기를 알 수는 없습니다 여기에 필요한 것은 배열입니다. 또한 악의적 인 C 스타일의 캐스트를 사용하여 잘못된 코드를 컴파일하도록 강요하는 것은 결코 좋은 생각이 아닙니다.

+1

아, 참으로 매력적입니다. –

+1

downvote에 대한 이유가 무엇입니까? 나는 이것이 효과가있을 것이라고 확신하지만, 내가 틀렸다면 나를 교정 해주십시오. –

+1

Downvote가 내 실수였습니다. 사과드립니다. – voodooattack

2

여기에서 알 수 있듯이 http://qt-project.org/doc/qt-4.8/qbytearray.html QByteArray에는 시작/끝 방법이 없습니다. 그러나 데이터/길이 있습니다. 결과 코드는 다음과 같이 보일 수 있습니다.

const unsigned char* begin = reinterpret_cast<unsigned char*>(byteArrayBuffer.data()); 
const unsigned char* end = begin + byteArrayBuffer.length(); 
std::vector<unsigned char> bufferToCompress(begin, end); 
+6

'begin'과'end'는 문서화되지 않은 것처럼 보입니다. 그들은 확실히 존재한다 (https://qt.gitorious.org/qt/qtbase/source/68fb37d762a818cc44ea69f7c3a80a3f010b6713:src/corelib/tools/qbytearray.h#L362). –