2014-11-28 9 views
0

QIODevice (특히 QTcpSocket)를 정의했으며 원시 형식으로 문자열을 쓰려고합니다. 나는 다음과 같은 예를 들어 내 소원을 설명합니다원시 QByteArray를 쓰거나 QByteArray를 조작하는 방법

char* string= "Hello World"; 

QByteArray bArray; 
QDataStream stream(&bArray, QIODevice::WriteOnly); 
stream.setVersion(QDataStream::Qt_4_6); 
stream << string; 

QFile file("Output.txt"); 
file.open(QIODevice::WriteOnly); 
file.write(bArray); 
file.close(); 

나는 다음과 같은 결과를 얻을 진수 편집기에서과 Output.txt를 열면 :

00 00 00 0C 48 65 6C 6C 6F 20 57 6F 72 6C 64 00 

00 00 00 0C = 4bytes (length of the following massage) 
48 65 6C 6C 6F 20 57 6F 72 6C 64 = 11bytes (the string "Hello World") 
00 = an one empty byte 

을하지만 내가 원하는 것을하지 이잖아. lenth를 4bytes에서 2bytes로 줄일 수 있습니까? 아니면 그냥 문자열을 잡고 대신 2bytes의 길이를 정의 할 수 있습니까?

내가 묻는 이유는 서버에 메시지를 보내려한다는 것입니다. 그러나 서버는 다음과 같은 형식으로 패킷을 받아 들인다 : 당신이 QDataStream의 직렬화 일치하지 않는 특별한 직렬화 포맷을해야하는 경우

00 0C 48 65 6C 6C 6F 20 57 6F 72 6C 64 

00 0C = 2bytes 
48 65 6C 6C 6F 20 57 6F 72 6C 64 = 11bytes 

어떤 도움이 좋을 것 =)

+0

음,'QByteArray'가있다'[]'연산자, 그래서 당신은 단지 "왼쪽"데이터 2 바이트를 이동, 규칙적인 배열로 사용하는 배열의 크기를 조정할 수 있습니다 끝 부분을 다듬 으십시오. 또는 첫 번째 2 바이트를 건너 뛰면서 다른 바이트 배열로 복사하십시오. – dtech

답변

0

는, 당신은 스스로를 코딩해야한다, 대신 QDataStream에 의존하고 결과를 수정하십시오. 그것은 그런 일이 될 수 :

QByteArray byteArray; 
... 
QDataStream stream(..); 
... 
byteArray.chop(1); // to remove the 0 character at the end of c string 
stream << quint16(byteArray.size()); // to write the size on 2 bytes 
for(int i = 0; i < byteArray.size(); i++) 
    stream << byteArray[i];