C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[72304] Re:나머지 바이트 채우기
StarWagon [starwagon] 4142 읽음    2015-01-29 01:01
뭐 역시 소켓통신을 써보진 않아서 맞을지는 모르겠으나,
변수에 어떤 값을 복사 할때를 생각하면 같은 맥락일거라고 생각합니다.

그래서... 두 가지 방법이 있는데요.

1) 8바이트 변수를 미리 0 으로 초기화.
	__int64 target=-1; //0xFFFFFFFFFFFFFFFFFFF
	memset(&target, 0, 8); //0 으로 8바이트 초기화
	char source[5]={0x05,0x04,0x03,0x02,0x01};//보낼데이터
	memcpy(&target,source,5); //전송?
	ShowMessage(IntToHex(target,8)); //확인


2) 받은 데이터를 1바이트 변수로 캐스팅 해서 6번째 주소를 참조하여 3 바이트를 0으로 채움.
	__int64 target=-1; //0xFFFFFFFFFFFFFFFFFFF
	char source[5]={0x9A,0x78,0x56,0x34,0x12};//보낼데이터 0x123456789A
	memcpy(&target,source,5); //전송?
	memset(&((char*)&target)[5],0,3); //6번째 부터 3바이트를 0으로 채움
	ShowMessage(IntToHex(target,8)); //확인


아마 2번이 실제로 원하는 답일 듯 싶습니다.

여기서, 변수의 값은 실제 메모리공간에 바이트 단위로
역순으로 들어 있다는 것을 주의 하셔야 합니다.
(실제론 비트 단위로 역순이지만...)

따라서 앞의 6자리(3바이트)를 초기화 하고 싶다면 뒤의 3바이트를 초기화 해야 합니다.

도움이 되셨기를...


제임스 님이 쓰신 글 :
: PC와 PLC소켓통신중입니다.  어떤 헥사값을 계산해서 5바이트 값을 얻었는데 8바이트로 처리를 해야되서
: 나머지 앞에 자리를 0x00으로 처리하여 8바이트를 얻고 싶습니다.
: 어떻게 해결할 수 있을까요? 계산값이 4바이트 이거나 3바이트 이여도 나머지 앞자리를 0x00으로 채워야 하는 상황입니다.
: 답변 부탁드리겠습니다. 헥사값 0x00은 NULL문자라 PLC장비에서는 입력 받을 수 없는 건가요?

+ -

관련 글 리스트
72303 나머지 바이트 채우기 제임스 3631 2015/01/28
72307     Re:나머지 바이트 채우기 제임스 3692 2015/01/29
72305     Re:나머지 바이트 채우기 박영목.월천 4104 2015/01/29
72304     Re:나머지 바이트 채우기 StarWagon 4142 2015/01/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.