2014-10-24 1 views
1

...C++ /는 IPC, 시리얼, 이더넷, 같은 통신 인터페이스를 통해 문자열을 보내는 때 프로그래머 치료 문자열 종단을 수행하는 방법

가 법적 단지 문자열 종료를 유지하는 것입니다 페이로드에 Qt를 문자열 Terminaton 따라서 페이로드 버퍼 내에 여러 문자열을 추가하면됩니까?

또는 통신 인터페이스를 통해 문자열 종료를 보내지 않는다고 말하는 규칙이 있습니까?

감사

+0

물론 모든 바이트는 원시 바이트입니다. 그럼에도 불구하고 원시 바이트가 NULL을 나타낼 때 내 종료 문자라고 말할 수 있습니다. 한 문자열이 끝나고 다른 버퍼가 버퍼 내에서 시작될 때를 결정하려면 s/t가 필요합니다. – binaryguy

+0

바이너리 데이터가 아닌 경우 '\ 0'을 종료해도 문제가 없습니다. 밖에 자주 사용됩니다. 심지어 나는 그것을 꽤 많이 사용했다. 그러니 걱정 마세요, 괜찮습니다. :-) – lpapp

+0

감사합니다. 나는 그것을 줄 것이다 – binaryguy

답변

1

당신은 당신이 그것에 대해 생각대로의 형태로 이러한 프로토콜을 통해 "문자열"를 전송하지 않습니다. 원본 바이트를 텍스트 또는 이진 형식으로 보냅니다. Qt 용어로 QByteArray 또는 QDataStream으로 생각하십시오.

"IO"의 기본 클래스 인 Qt 프레임 워크에서 QIODevice 클래스의 클래스를 찾을 수 있습니다. 그런 다음 QtCore의이 기본 클래스는 QtSerialPort, QtBluetooth, QtNetwork 및 이와 유사한 모듈과 같은 하위 클래스에서 다시 구현됩니다.

일반적으로 귀하의 질문은 프로토콜 지향, 즉 프로토콜 디자인과 조금 더 비슷합니다. 텍스트 데이터이거나 일반적으로 길이 필드가있을 수있는 경우 대개 종료 문자가 있습니다. 종료 문자는 데이터에 따라 다를 수도 있으므로 \0이 아닙니다.

예를 들어 우리가 사용하는 프로토콜은 때때로 '\ n'이고 때로는 ';'입니다. 그리고 무엇하지. 그것은 당신에게 달려 있지만, 전용 종료 문자를 사용하면 실제로 유효하며 광범위하게 사용됩니다.

당연히 길이 필드 만 이진 모드로 전송 될 때 적용될 수 있습니다.

+0

프로토콜은 혼자서 구현되었다. 다중 문자열 송신을 지원해야한다. 한 문자열이 끝나고 다른 문자가 시작될 때를 알기 위해서 마커처럼 s/t가 필요합니다. 이것은 NULL 일 수 있습니다. QByteArray는 종료 문자를 제거합니까 아니면 원시 바이트로 변환합니까? – binaryguy

+0

NULL이 문자가 아닙니다. 그것은 C/C++입니다. 실제로 그것은 0 (숫자)이고, 이것이 의미하는 것이면 '\ 0'이 아닙니다. QByteArray는 이름에서 알 수 있듯이 바이트 배열이므로 바이트를 그대로 해석합니다. 따라서 '\ 0'을 유지합니다. 그러나 다시, 그것은 NULL이 아닙니다. 사실, 일부 컴파일러에서 NULL은 C++ 11의 새로운 nullptr로 구현되었는데, 기이하게도 이상하지도 않습니다. – lpapp

+0

Sry, 내 잘못, 나는 NUL을 의미했다. 그러나 QByteArray 그것을 유지하고 인터페이스를 통해 주어진 원시 바이트 보내고 수신기가이 문자열을 문자열의 길이를 결정하기 위해 NUL을 사용할 수있는 알고있는 경우? – binaryguy

2

모든 인터페이스를 통한 통신은 정의 된 프로토콜에 따라 이루어져야합니다. 문자열 종료 규칙이있는 경우 프로토콜에 의해 정의됩니다. 기존 프로토콜을 통해 통신하지 않는 경우 프로토콜 (예 : 사용자 정의 프로토콜)을 정의해야합니다. 여기서 문자열을 종료하는 방법과 끝내는 방법을 정의합니다.