2014-07-06 1 views
0

아래 코드를 찾으십시오. 함수에서 strlen 이진 및 ascii 데이터에 대해 동일한 값을 반환합니까?

unsigned char bInput[20]; 
unsigned char cInput[20]; 

, 나는 bInput에서 바이너리 데이터를 얻을 나는 strlen(bInput)를 사용하여 길이를 결정했다. bInput을 이진 형식으로 ASCII로 변환하여 cInput에 저장하고 길이를 인쇄했습니다. 그러나 둘 다 다릅니다.

프로그래밍 초보자입니다. 행동에 대해 안내해주십시오.

+4

아니요, strlen은 임의의 비 문자열 데이터에 대해 작동하지 않습니다. –

+1

'strlen'은 0 바이트를 찾을 때까지 한 번에 하나씩 바이트를 검색하여 작동합니다 (문자열의 일반적인 종결 자임). 실제 데이터 바이트가 0 일 수있는 바이너리 데이터에서 제대로 작동하지 않습니다. –

+2

"ASCII로 변환 된 2 진수"는 무엇을 의미합니까? –

답변

1

결과는 두 경우 모두 동일하지 않습니다. 다음은 하나의 샘플 시나리오입니다. Null은 유효한 UTF-8이며 C 'strings'에서는 작동하지 않습니다.

char temp[8]; 
    buf = "abcde\0f"; 

는 우리가 여기 것은 이러한 char 값 포함 길이 8의 버퍼이다 : 여기

97 98 99 100 101 0 102 0 

를 나 strlen (온도)는 5의 strlen 도면에 따라, 그러나, 실제 같다 버퍼의 길이는 8이다.

3

함수 strlen은이 함수에 전달 된 입력 인수로 표시되는 메모리 주소에서 시작하여 값 0 (AKA '\0')의 메모리에있는 첫 번째 문자의 인덱스를 반환합니다.

제로 종료 문자열 (해당 메모리 주소에 올바르게 할당 됨) 이외의 "다른 것"의 메모리 주소를 전달하면 메모리 액세스로 인한 결과가 발생할 가능성이 매우 높습니다 위반 (일명 세그먼테이션 결함).

+0

@ user2531564 : V를 되찾기로 결정했다면, 적어도 합리적으로 더 나은 대답을하기 위해서하십시오. –

1

strlen()은 NULL 문자 (바이트 값이 0 인 것을 의미하는 '\0')에 도달 할 때까지 각 바이트를 카운트합니다. 따라서 바이너리와 아스키 문자의 길이가 다른 경우 변환 논리의 아래 두 점을 확인해야합니다.

  • 이진 값이 0 인 경우 수행중인 작업을 의미합니다.
  • 0이 아닌 값을 0으로 변환하는지 여부.