2010-02-22 5 views
2

소켓으로 작업 중이며 단순히 문자열을 소켓에 쓰려고합니다. 다음 예제 (oStream은 NSOutputStream)와 같이이 작업을 수행하는 방법에 대한 몇 가지 예제를 발견했습니다. 이것은 모두 NSStreamEventHasSpaceAvailable 내에 있습니다.uint8_t 버퍼에 NSString 넣기

uint8_t buffer[11] = "I send this";    
int len; 
len = [oStream write:buffer maxLength:sizeof(buffer)]; 

잘 작동합니다. 그래서 NSString 밖으로 바이트를 가져 와서 사용자 지정할 수 있도록 수정했습니다.

int len; 
NSString* strId; 
strId = @"string will be customized with several lines of code here"; 

uint8_t buffer[[strId lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];      
[strId getBytes:buffer maxLength:sizeof(buffer) usedLength:NULL encoding:NSASCIIStringEncoding options:NULL range:NSRangeFromString(strId) remainingRange:NULL]; 
len = [oStream write:buffer maxLength:sizeof(buffer)]; 

이것은 전혀 작동하지 않습니다. 그것은 버퍼 (아마도 바이트)에 완전한 횡설수설을 씁니다. 그리고 getBytes의 인수 5를 전달하면 getBytes 행에 대한 경고가 표시됩니다. 캐스트없이 포인터에서 정수를 만듭니다. "

죄송합니다. 이전에 질문을 받았다면 검색에서 답변을 찾을 수 없으므로 문제를 해결하는 것이 매우 간단해야합니다. 감사!

편집 : 나는 작동하는 것 같다 뭔가를 발견했습니다,하지만이 같은 적절한 프로그램이 있는지 잘 모르겠어요. 아래 답변을 참조하십시오. 이 상황에서 위험한 코드를 사용하고 있습니까?

+0

인수 5는 정수 (사실 NSNSEncodingConversionOptions 열거 형의 멤버이거나 열거 형 멤버의 조합)에 대한 것이고 NULL을 전달하면'(void *) '로 확장됩니다. 0 '이다. 경고를 닫으려면 0을 전달하십시오. (그래도 문제가 해결되지는 않습니다.) – zneak

+0

감사합니다. 그건 경고를 없애 버렸지 만, 당신이 말했듯이 실제 문제는 해결하지 못했습니다. 그것은 앞으로 나아가 야 :) – mjdth

답변

3

-[NSString cStringUsingEncoding:]? 나는 이것이 작동하는 것 같다 것으로 나타났습니다 더 많은 연구 후

+0

C에서 동적 배열 크기를 설정할 수 없기 때문에 그것의 특정 규칙 외에도 Objective-C가 C 규칙에 따라 작동합니다. 즉, cStringUsingEncoding에서는 배열을 만들 필요가 없습니다. 'const char *'를 반환하므로 결과를 받기 위해서는'const char *'만 선언하면됩니다 :'const char * buffer = [strId cStringUsingEncoding : NSASCIIStringEncoding];' 배열 (당신은 그것에'sizeof'을 사용할 수 없다는 것을 제외하고). – zneak

3

:

len = [oStream write:[[strId dataUsingEncoding:NSASCIIStringEncoding] bytes] maxLength:[strId lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 

나는 그것이 NSOutputStream에 데이터를 가져 오는 다른 몇 가지 방법을 사용하여 이후 이들은 매우 안전하지 것처럼 느낄뿐만 아니라, 길이. 이런 일을하는 데 문제가 있습니까?

+0

이것은 사용 끝난 방법 이었지만 올바르게 작동하기 때문에 다른 하나를 올바른 답으로 표시 할 것입니다. – mjdth