[질문] unsigned char* 이 가리키는 데이터의 길이재기

picpic76의 이미지

void temp(unsigned char* value)
{
        //if (value의 길이가 8이 맞으면)
	for(int i=0;i<8;++i)
		printf("%c",value[i]);
	printf("\n");
}
 
int main()
{
	unsigned char* value = new unsigned char[8+1];
 
	value[0]=0x41;
	value[1]=0x41;
	value[2]=0x41;
	value[3]=0x41;
		// 중간에 0x00이 올수 있음.
	value[4]=0x00;
 
	value[5]=0x41;
	value[6]=0x41;
	value[7]=0x41;
	value[8]=NULL;
 
	printf("%d\n",strlen((char*)value));
	temp(value);
 
 
	delete value;
	return 0;
}

unsigned char형의 포인터가 가리키는 데이터(string이라기보다는 unsigned형이니깐
바이트스트림이라고 보는게 낳겠죠?) 의 길이를 확인하려고 하는데..
중간에 0x00 의 값이 들어올수도 있는 상황입니다.
이럴때 어떤 함수를 이용해서 그 길이를 알수있을까요?
sizeof는 아닐테고, strlen으로하면 0x00을 null로 측정하니 당연히 중간까지만 세구
끝낼테고.
현재 저러한 상황에서도 8임을 알아야 할텐데..(unsigned char*을 함수전달시 쓰려구요,
길이가 8자로 고정되있는탓에 예를 들어 int형의 value_Length는 전달안할껍니다..)
전달받는 함수에서 저 8임을 어떻게 확인할수 있을까요 ?
if 문안에 어떻게 써야할지 잘 모르겟네요 ^^

seoleda의 이미지

그냥 if (!value[8]){ ... } 이렇게 쓰면 안돼나요?
NULL과 0x00은 개념상으로는 다르지만 들어있는 내용은 같아서(?) 둘을 구분하기란 어려울 것 같습니다.

Necromancer의 이미지

중간에 0x00이 들어올 수도 있다...
그럼 길이를 잴 방법이 없습니다.

unsigned char * 포인터가 가리키는 데이터의 길이를 다른 int 변수에 저장하거나
아니면 unsigned char *포인터가 가리키는 데이터 내에 데이터 길이를 알려줄
수 있는 어떤 정보를 집어 넣어 주어야 합니다.

보통 문자열 끝에 0x00을 붙이는데,
이 이유는 문자열 길이 정보를 따로 보관하지 않고도
문자열 길이나 끝 위치가 어느 부분인지를 쉽게 알아내기 위해서입니다.
(사실 문자열 내에는 0x00을 쓸 이유 없습니다)

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

picpic76의 이미지

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

문자열이라기보다는 일반적인 바이너리파일의 내용을 읽어올 참이어서요.
중간에 종종 0x00이 있기도 하드라구요 ^^

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

freemckang의 이미지

스트림 계열의 함수를 쓰시나요? 파일에서 읽어오는 것이라면 의외로 쉽게 해결되지 않을까요??

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

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

cruega의 이미지

만약 malloc 이나 new 를 management 해서, 할당된 pointer 와 size 를 가져올수도 있겠습니다.
할당 받은 놈들중에 value 의 pointer 를 찾아서 그놈 size 를 가져와서 그만큼 읽는다...
저는 이정도 밖에는...
근데 왜 size 를 안넘길려는지...?

cruega의 이미지

malloc, new 를 바로 써서는 관리가 힘들고, 한다리 거치는 API 가 있어야 됩니다.
예전에 malloc, free check 한다고 써먹던 방법이네요...

cmoh1110의 이미지

주제와는 상관없는데..
value[8] = NULL; => value[8] = 0;
delete value; => delete [] value;
로 고치셔야 할 듯.. ;)

ㅡ,.ㅡ;;의 이미지

일반적으론 길이를 넘겨야죠..

꼭 아규먼트를 하나로 하고 싶을때...

어차피 스트링이 아니라면 value에 길이를 담아갈수도 있죠..

char *new unsigned char[8+1]; == 스트링이 아닌데 +1 이필요가 없겠죠.. 어쨋든..
char *value = new unsigned char[8+4];

*(int *)value=8;
value[4] = 0x41;
.......;

구조체이용하시든가..
----------------------------------------------------------------------------

C Library Development Project


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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.