unsigned char* 형의 자료를 쉽게 복사할수있는 방법이...

picpic76의 이미지

안녕하세요. 작업중에 매번 귀찬은 작업을 하게되니
좀이상한것같아서 고수님들에게 함 여쭈어보려구요 ^^

int main()
{
	//unsigned char temp[10+1]="AAAAAAAAAA"; 요럴땐 문제가 안됩니다.
 
	unsigned char temp[10];
	temp[0]=0x41;
	temp[1]=0x41;
	temp[2]=0x00;		// 요기가 문제입니다. 
	temp[3]=0x41;
	temp[4]=0x41;
	temp[5]=0x41;
	temp[6]=0x41;
	temp[7]=0x41;
	temp[8]=0x41;
	temp[9]=0x41;
	temp[10=NULL;	// 조금 의심스러움,배열이라서 넣어봤어요
                           // 실제로는 메모리할당해서 쓴답니다 ^^
 
	unsigned char temp2[10+1];
 
	for(int i=0;i<10;++i)
	{
		temp2[i] = temp[i];
	}
 
        //memcpy(temp2,temp,10);  쓰지못하는 상황
 
	printf("[");
	for(i=0;i<10;i++)
		printf("%c",temp2[i]);
	printf("]\n");
 
	return 0;
 
}

unsigned char* 포인터가 가리키는 데이타의 1바이트가 0~255이기때문에
솔직히 값중에 0x00이 들어가는 경우가 종종 있거든요(예를 들어 어떤값을
해쉬나 암호화를 했을때 행여나 0x00이 들어있어서 , 그런경우를 대비해서
unsigned char*형을 쓰고있거등요 ^^)

솔직히 string이라면야 얼마든지 함수가 있지만 unsigned char의 경우
memset,memcpy를 써야하는데..문제는 unsigned char 형끼리의 데이터
두개를 붙혀야할때도 있고 혹은 하나를 두개로 나누어야할때가 있어서요
(이게 조금 난감하죠, 맨날 for문 돌려서파악하기가 애매한...이게 왠지 아닌거같은 느낌이..)
그리고 함수에서 전달하고 리턴하거나 할때 항상 길이변수를 전달해야하니
이것두 왠지 매번 귀찬구요..(고수님들은 이런경우 아예 구조체를 만들어서 쓰시는지요)

memcpy도 이상황 빼고는 많이 활용을 못하고 있네요.

혹은 그리고 지금 이코드에서 memset을 쓰는게 적당한가요 ? 아니면
바로위 for문으로 돌리는게 낳은건가요 ?

아 결론이라면 혹시 unsigned char를 쓸수 있는 strcat같은게 행여나
기본함수로 존재하고 있나요? (팀장님이 형변환해서는 쓰지말라구 하네요,
실제로 strcat등에 (char*)으로 형변환해서 안써봤지만 안될듯하구요)

이런식의 코드가 올바른지 궁금해서 글 올려봅니다 ^^

picpic76의 이미지

안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^

개발일이 1년이 넘었는데..조금 부끄럽긴합니다. 공부를 넘 안해서요 ㅡ.ㅜ
C로 개발을 시작했는데 왠지 좀 어려운 녀석으로 시작한것같네요

안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^

GENIUS의 이미지

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

그냥 생각나는 데로 적습니다.
도움이 되길 바랍니다.

먼저 unsigned char BUF[10];
으로 정의된 버퍼에 들어 있는 내용을 보면 통신 버퍼로 사용하는 경우가 많지요.

여기서 몇번째 바이트를 참조 하여야 하거나 몇번째 바이트 부터를 스타트 , OFFSET으로 잡아야 하는 경우가 있지요.

먼저 5번째 바이트만을 참조 할때는 이렇게 합니다. BUF[4] 알고 있을 것 입니다. 이렇게 바이트를 대입했으니까요.

그리고 5번째 바이트 부터를 시작으로 잡고 싶다면은 &BUF[4] 라고 하면 잘라서 다른 버퍼에 넣지 않아도 참조하는데 무리가 없지요.
그리고 수신 버퍼라면 수신될때 수신 버퍼외에 수신된 바이트도 함께 리턴하도록 하는 것은 필수 입니다.
스트링이 아닌 바이트 통신에는 ZERO 값이 포함되기 때문에 나중에 첵크 할수가 없지요.

리턴 된 바이스의 갯수가 N 이라면

수신 버퍼에 들어 있는 바이트를 보기 위해서는
이렇게 %c 를 쓰지 않고

%02X를 사용 합니다ㅏ.
for(i=0;i printf("%02X",BUF[i]);
printf("\r\n");

도움이 되었길 바랍니다.

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

ㅡ,.ㅡ;;의 이미지

>..문제는 unsigned char 형끼리의 데이터
>두개를 붙혀야할때도 있고 혹은 하나를 두개로 나누어야할때가 있어서요
>(이게 조금 난감하죠, 맨날 for문 돌려서파악하기가 애매한...이게 왠지 아닌거같은 느낌이..)
>그리고 함수에서 전달하고 리턴하거나 할때 항상 길이변수를 전달해야하니
>이것두 왠지 매번 귀찬구요..(고수님들은 이런경우 아예 구조체를 만들어서 쓰시는지요)

데이터를 붙이든 나누든.. 상관있나요..
함수에 전달할때 길이 전할다는거 어찌보면 당연한겁니다.
식당에 단체손님 예약할때 항상 인원 알려주죠... 그걸 이상하게생각하는사람은 없죠.

----------------------------------------------------------------------------
C Library Development Project


----------------------------------------------------------------------------

freemckang의 이미지

맞는 말씀인것 같아요. 지금이야 하나의 함수에서 모두 처리되었으니까 상관없겠지만, 다른 함수로 포인터만 넘겨야 된다면 길이를 알아채기 위해서 의외로(?) 부담이 큰 strlen을 쓴다던가, 아니면 질문자님이 쓰신 것처럼 중간에 0x00이 들어가면 알아차리기 힘들어질 수도 있으니까요... 구조체를 만들던, 인자를 하나 더 늘리던 해서 크기를 같이 보내주는 것이.. 낫지 않을까 싶습니다.

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

freemckang의 이미지

맞는 말씀인것 같아요. 지금이야 하나의 함수에서 모두 처리되었으니까 상관없겠지만, 다른 함수로 포인터만 넘겨야 된다면 길이를 알아채기 위해서 의외로(?) 부담이 큰 strlen을 쓴다던가, 아니면 질문자님이 쓰신 것처럼 중간에 0x00이 들어가면 알아차리기 힘들어질 수도 있으니까요... 구조체를 만들던, 인자를 하나 더 늘리던 해서 크기를 같이 보내주는 것이.. 낫지 않을까 싶습니다.

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.