:: 진공에 대해 알려주마.

"A\0B\0C\0\0\0\0\0\0\0\0\0" 본문

진공/노하우

"A\0B\0C\0\0\0\0\0\0\0\0\0"

하이백 2023. 4. 8. 19:36

"A\0B\0C\0\0\0\0\0\0\0\0\0"
받아온 문자열이 이 모양 이다. 이걸 어떻게 처리하지...

SharedMemeroy를 이용하여 통신을 시도하였다. string 문자열을 받아 Char*로 변환해야 한다. 
C#에서는 MMF에 write 한 그대로 read가 가능했다. 잘 사용하였다. 
하지만 이번에 C++과 C#을 교차하여 값을 주고받으려 한다. 

MMF(Memoty Mapped File)을 이용하여 C#에서 문자열을 쓰고 C++에서 읽어오면 아래 그림과 같이 한 글자마다 사이에 \0가 붙어 이를 처리하면 한 글자만 인식하여 원하는 대로 처리가 되지 않는다.

찾아보니 VS2013 쯤 부터 적용된 멀티 바이트 현상이다. 다 아는 내용 이겠지만 아래 사이트를 참고 하시라.
https://coding-restaurant.tistory.com/472

전에도 이런 현상이 있어 어떻게 한것 같은데 기억이 나지 않는다. 그리하여 찾아보니 금방 해결될 것 같았다. 반대의 경우는 아래 링크를 참고하시라. (Named pipe를 이용하여 C++에서 쓰고 C#에서 읽는 경우)
https://stackoverflow.com/questions/35839898/string-abc-becomes-a-0b-0c-0-after-going-through-named-pipe-from-c-to-c-sh

 

받아온 "ABC" 스트링이 이 모양이다. !!


요런 거
(LPSTR)(LPCTSTR)strMsg;

저런 거
strcpy(szMsg, strMsg.GetBuffer(), strmsg.GetLength());

읽어온 문자열을 char 형태로 변한 하기 위하여 위의 명령들을 사용해 보았다. 하지만 해결되지 않는다. 뭐지. 다시 뒤지고 뒤지고 하다 귀인을 만났다. 문자 사이에 붙어 있는 \0을 특별히 처리하지 않고 아래와 같이하면 위의 문제가 해결된다.
https://skql.tistory.com/559

char Buffer[255];
CString szString;
size_t CharactersConverted = 0;

wcstombs_s(&CharactersConverted, Buffer, szString.GetLength()+1, szString, _TRUNCATE);

출처는 여기  잉여생활~ ㅋ.,ㅋ   ( https://skql.tistory.com/559)   
무려 2009년도 글이다. 먼저 고생하신 잉여생활님께 존경을...

 

'진공 > 노하우' 카테고리의 다른 글

리부트  (0) 2023.09.23
TOOLS (Type casting and ...)  (0) 2023.08.26
VIEW MON of RS-485  (0) 2022.11.20
시리얼 통신  (4) 2022.09.17
Access CC-LINK  (0) 2022.08.31
Comments