[질문] unsigned char* 이 가리키는 데이터의 길이재기
글쓴이: picpic76 / 작성시간: 월, 2007/02/05 - 8:20오후
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 문안에 어떻게 써야할지 잘 모르겟네요 ^^
Forums:
그냥 if (!value[8]){ ... }
그냥 if (!value[8]){ ... } 이렇게 쓰면 안돼나요?
NULL과 0x00은 개념상으로는 다르지만 들어있는 내용은 같아서(?) 둘을 구분하기란 어려울 것 같습니다.
중간에 0x00이 들어올
중간에 0x00이 들어올 수도 있다...
그럼 길이를 잴 방법이 없습니다.
unsigned char * 포인터가 가리키는 데이터의 길이를 다른 int 변수에 저장하거나
아니면 unsigned char *포인터가 가리키는 데이터 내에 데이터 길이를 알려줄
수 있는 어떤 정보를 집어 넣어 주어야 합니다.
보통 문자열 끝에 0x00을 붙이는데,
이 이유는 문자열 길이 정보를 따로 보관하지 않고도
문자열 길이나 끝 위치가 어느 부분인지를 쉽게 알아내기 위해서입니다.
(사실 문자열 내에는 0x00을 쓸 이유 없습니다)
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
안녕하세요. 초보
안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^
문자열이라기보다는 일반적인 바이너리파일의 내용을 읽어올 참이어서요.
중간에 종종 0x00이 있기도 하드라구요 ^^
안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^
바이너리 파일을 읽어온다면...
스트림 계열의 함수를 쓰시나요? 파일에서 읽어오는 것이라면 의외로 쉽게 해결되지 않을까요??
句日新, 日新 日新 又日新.
句日新, 日新 日新 又日新.
음...
만약 malloc 이나 new 를 management 해서, 할당된 pointer 와 size 를 가져올수도 있겠습니다.
할당 받은 놈들중에 value 의 pointer 를 찾아서 그놈 size 를 가져와서 그만큼 읽는다...
저는 이정도 밖에는...
근데 왜 size 를 안넘길려는지...?
음...
malloc, new 를 바로 써서는 관리가 힘들고, 한다리 거치는 API 가 있어야 됩니다.
예전에 malloc, free check 한다고 써먹던 방법이네요...
주제와는
주제와는 상관없는데..
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
----------------------------------------------------------------------------
댓글 달기