이진 스트림을 처리"- 패킷

M

mhamini

Guest
나는 그런 일이 어떤 시리얼 포트를 통해 오는 이진 데이터의 스트림을 처리하는 중이에요.데이터 패킷의 여러 종류의 양식을 취하고 내가 처리 및 더 많은 패킷 형식을 추가하기위한 간단한 프레임 워크를 연장합니다.
내가 만든 설명한 예를 들어, 샘플의 솔루션입니다 ...

# 포함 <fstream>
# 포함 <iostream>

네임 스페이스를 사용하여 : : 표준;

/ / 패킷 형식 0x33, 0x44, [Packtype], [데이터], [데이터], [자료]
/ / 앞에 더미 데이터를 다시 비트

숯불 서명되지 않은 데이터를 [] = (0x11, 0x23, 0x34, 0x33, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x32, 0x45, 0x33, 0x44, 0x02, 0x12, 0x54, 0xA1, 0xBC, 0x11);

클래스 Pack1
(
공개 :
숯불 데이터 [3];
);

클래스 Pack2
(
공개 :
숯불 데이터를 [5];
);

무효 WriteData ()
(
OFS ofstream ( "test.dat", 개조 : : 바이너리);

ofs.write ((숯불 *) & 데이터, sizeof (데이터));
)

주요 int ()
(
숯불 C;
헤더 int = 0;

/ / WriteData ();
IFS는 ifstream ( "test.dat", 개조 : : 바이너리);

반면 (ifs.get (C)) (
만약 ((헤더 == 0) & & (C == 0x33)) (/ / 헤더 팩을의 첫 부분을 가지고
숯불 D 조 = ifs.peek ();
(d 개의 == 0x44) (경우
ifs.get (); / / Get 및 2ns 헤더 바이트를 버리고
헤더 = 1;

/ / 어떤 패킷을 찾을 수
C = ifs.peek ();
(C == 0x01) (경우
법원 "" "Pack1" ""endl어요;
Pack1 P1과;

ifs.read ((숯불 *) & P1과, sizeof (P1과));
헤더 = 0;
) 다른 경우에는 (C == 0x02) (
법원 "" "Pack2" ""endl어요;
Pack2 p2;

ifs.read ((숯불 *) & p2, sizeof (p2));
헤더 = 0;
)
)
)
)

반환 0;
)

부여 ....

Pack1어요
pack2어요

제가보기에는 이것이 짓을 아주 못생긴 방법처럼 보인다.분명히 거기에 패킷을 확인하고있어 우리는 정의의 일부 캡슐 좋은 방법입니다.난 더 나은 쥐덫에 이렇게 조언을 찾고 있어요.누구, 저 좀 도와 수있는 코드의 일부 미리보기 있나요?근본적인 시스템이 어떻게 처리 TCPIP 즉, 메시지가 뭐, 틀림없이이 좋은 솔루션 정제된입니다.

 
성능 말하기 - 현명하고, 그것을 귀하의 특정 컴파일러 스트림 클래스의 구현에 많이 의존한다.

대용량 파일 스트림을 처리하는 내 자신의 경험을 바탕으로 (동적으로 비행)에 편집.그것은 "구현"메모리 매핑 파일을 사용하여 자신의 것이 좋습니다.이 메모리 매핑된 파일 win32API 시간 코스의 오른쪽에 매개 변수 ()와 CreateFile 함수를 사용하여 구현됩니다.

내가 직접하지 귀하의 질문에 대한 답변 알아,하지만 난 그것을 고려하기 좋은 것 같아요

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="윙크" border="0" />

.

 

Welcome to EDABoard.com

Sponsor

Back
Top