2016-06-22 1 views
1

signed int의 typedef이며 Qt에서 지원하는 모든 플랫폼에서 32 비트가 될 것이라는 Qt의 설명서가 있습니다.qint32를 이식 가능하게 (de) 직렬화하는 방법?

Thisshort 이상이어야하며 16 비트 이상이어야합니다. 따라서 typedef에만 크기의 보증은 없습니다. Qt는 그 주위에 그 it seems를 얻는다.

그래서 Qt를 사용한 (비) 직렬화는 크기가 항상 그렇게되기 때문에 좋습니다. 그러나 이것은 내가 생각하는 숫자의 이진 표현에 대해서는 아무 것도 말하지 않는다. 그리고 이식성있게 직렬화 할 때 중요합니다. 이 일을 예를 들어

QFile file("somefile"); 
file.open(QIODevice::WriteOnly); 
qint32 i = 10; 
file.write(reinterpret_cast<const char*>(&i), sizeof(i)); 
file.flush(); 
file.close(); 

는 바이너리 형식의 파일에 값 10 qint32을 작성합니다. 나는이 일을 Qt를 작성 다른 응용 프로그램에 네트워크를 통해 해당 파일을 보낼 때 :

QFile file("somefile"); 
file.open(QIODevice::ReadOnly); 
qint32 i = 0; 
file.read(reinterpret_cast<char*>(&i), sizeof(i)); 
file.close(); 

난 정말 다시 번호를하지만 항상 10로 보장 할 것인가? 나는 그 기계에서 10의 2 진 표현이 다를 수 있다고 생각하지 않는다. 그러나 그것이 틀린 것을 이해할 수 있으며 이것은 (적어도 Qt가 지원하는 플랫폼에서) 논쟁의 여지가 없습니다.

내 질문 : 어떻게 portably (드) Qt에서 원시 타입을 직렬화? 또는 사이즈 보증은 충분합니까?

+2

Qt는'CHAR_BIT == 8'과'sizeof (int) == 4'가 아니면 컴파일하지 않습니다. 이것은 명백하게 테스트되었습니다. https://code.woboq.org/qt5/qtbase/src/corelib/global/qglobal.cpp.html#106 – peppe

답변

8

QDataStream을 (비) 직렬화에 사용할 수 있습니다. QIODevice를 상속하고 qint32에 대한 명시 적 입력 및 출력 연산자가있는 모든 것에 쓰거나 읽습니다.

+0

감사합니다. 문서는 명시 적입니다. "데이터 스트림은 다음과 같은 이진 스트림입니다. 호스트 컴퓨터의 운영 체제, CPU 또는 바이트 순서에 100 % 독립적 인 인코딩 된 정보입니다. 예를 들어, Windows에서 PC로 작성된 데이터 스트림은 Solaris를 실행하는 Sun SPARC에서 읽을 수 있습니다. " 나는 웬일인지 그리워했다. – Resurrection

1

나는 Qt가 지원하는 모든 플랫폼에서 다음과 같은 것을 가지고 있다고 확신한다 : assert(CHAR_BIT == 8).

이러한 가정을 감안할 때 걱정할 필요가있는 것은 바이트 엔디안입니다. 유감스럽게도 출연진은 엔디안을 고려하지 않습니다. 원시 엔디안 형식의 정수를 쓰고 데이터가 기본이라고 가정하고 읽습니다.

사실상의 표준 솔루션은 항상 큰 엔디안 인 네트워크 엔디안으로 /에서 변환하는 것입니다. Qt가 정확하게 할 수있는 함수를 제공한다는 것을 알게 될 것입니다 : http://doc.qt.io/qt-4.8/qtendian.html

편집 : 직접 직렬화를 구현하는 대신 G.M.의 대답을 확인해보십시오.

0

이진 표현에 국한되지 않습니다. (Qt는 JSON을 지원합니다.)

관련 문제