다른 비 Qt 프로그램에서 생성 된 정의 된 구조의 스트리밍 된 바이너리 데이터 (QDataStream)를 처리해야합니다. 나는 그 데이터를 해석하는 가장 좋은 방법이 무엇인지 궁금합니다. 데이터가 다음과 같이 텔레 그램에 구조화되어 있고 (구조 정의가 제공됨) 자신이 변경할 수 없다고 가정 해 보겠습니다.모범 사례 : QDataStream을 해석/처리하는 방법?
4 바이트 헤더 | 2 바이트 시퀀스 번호 | 1 바이트 체크섬 | 10 개 바이트 데이터
나는 다음과 같은 가능성은 "전보"클래스의 데이터를 처리하기 위해 참조
:- 전보 클래스는 개인 QByteArray 멤버 변수가 있습니다. 모든 데이터 (17 바이트)는 readRawData 메서드로 스트림에서 즉시 읽히고 거기에 저장됩니다. 변수는 시퀀스 번호에 대해
return (array.at(4)<<8) + array.at(5)
과 같은 공용 메소드를 통해 액세스되고 해석되며 매우 우아하지 않습니다. - Telegram 클래스에는 구조체와 함께 공용 char [17] 멤버 변수가 있습니다. 모든 데이터는 readRawData로 스트림에서 읽어 와서 거기에 저장됩니다. 이후에 변수에 액세스 할 때 이것은 struct에만 적용됩니다 (예 :
telegramstruct.squenceNumber
). 엔디안과 패딩과 같은 잠재적 인 문제가 있습니다. - Telegram 클래스에는
QString strHeader
과 같은 전신 필드에 대한 전용 멤버 변수가 있습니다. 스트림에서 텔레 그램을 읽을 때 데이터는 이러한 변수에 직접 저장됩니다. 읽기는 readRawData 또는 기본 유형 인 >> 연산자로 수행됩니다.
처리 할 데이터가 많으므로 가능한 빨리 코드를 작성해야합니다. MinGW가 설치된 Windows에서 Qt 5.0.1을 사용하고 있습니다.
내 질문 : 위의 솔루션
- 하나의 모범 사례와 빨리, 또는 더 나은 방법은 무엇입니까?
- 3 에서처럼 4 바이트, 2 바이트, 1 바이트를 읽는 것보다 한 번에 모두 빠르게 읽는 것과 비슷합니까?
- 1과 3을 사용하면 제공된 헤더 파일을 정의 된 구조체와 함께 사용할 수 없습니다. 이는 나쁜 습관입니까?
- QByteArray와 구조체의 "공용체"를 가질 수 있습니까?
- 솔루션 3으로 체크섬을 어떻게 쉽게 계산할 수 있습니까?
의견과 힌트를 보내 주셔서 감사합니다.
크리스
모든 질문에 답변 할 시간이 없지만 분명히 노조 및 비트 필드 방식을 사용합니다. 비트 필드의 경우 http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htm – Matthew
@Matthew 감사합니다. 너의 답. 그러나 비트 필드가있는 구조체는 패딩되므로 적어도 무작위 레이아웃에는 적합하지 않습니다. 기억, 나는 이진 데이터의 구조에 영향을 미칠 수 없습니다. – Chris