Помещение NSString в буфер uint8_t - PullRequest
2 голосов
/ 23 февраля 2010

Я работаю с сокетами и пытаюсь просто записать строку в сокет. Я нашел пару примеров, как это сделать, например, следующий пример (oStream - это NSOutputStream). Это все в пределах NSStreamEventHasSpaceAvailable.

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 делает целое число из указателя без приведения.»

Извините, если об этом уже спрашивали, не удалось найти ответ при поиске, и, похоже, проблему нужно решить очень просто. Спасибо!

EDIT: Я нашел что-то, что, кажется, работает, но я не уверен, что это правильное программирование чего-то подобного. Пожалуйста, смотрите ответ ниже. Этот опасный код использовать в этой ситуации?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

После дополнительных исследований я обнаружил, что это похоже на работу:

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

Мне кажется, что это не очень безопасно, так как он использует несколько различных способов передачи данных в NSOutputStream, а также длину. Будет ли проблема при этом?

3 голосов
/ 23 февраля 2010

А как насчет -[NSString cStringUsingEncoding:]?

...