Помещение NSString в буфер uint8_t

Я работаю с сокетами и пытаюсь просто написать строку в сокет. Я нашел пару примеров того, как это сделать, например следующий пример (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: Я нашел что-то, что кажется работающим, но я не уверен, что это правильное программирование чего-то подобного. Пожалуйста, смотрите ответ ниже. Этот опасный код следует использовать в этой ситуации?


person mjdth    schedule 22.02.2010    source источник
comment
Аргумент 5 касается того, что options должно быть целым числом (фактически членом перечисления NSStringEncodingConversionOptions или комбинацией членов указанного перечисления), и вы передаете NULL, который расширяется до (void*)0. Передайте его ноль, чтобы закрыть предупреждение. (Однако это не решит вашу проблему.)   -  person zneak    schedule 23.02.2010
comment
Спасибо zneak. Это избавило от предупреждения, но, как вы сказали, не решило настоящую проблему. Но это шаг вперед :)   -  person mjdth    schedule 23.02.2010


Ответы (2)


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

person zneak    schedule 22.02.2010
comment
Это потому, что вы не можете установить размер динамического массива в C, а Objective-C, помимо своих конкретных правил, работает по правилам C. При этом cStringUsingEncoding не требует от вас создания массива. Он возвращает const char*, поэтому все, что вам нужно объявить, это const char*, чтобы получить результат: const char* buffer = [strId cStringUsingEncoding:NSASCIIStringEncoding]; Затем вы можете использовать его как массив (за исключением того, что вы не можете использовать для него sizeof). - person zneak; 23.02.2010

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

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

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

person mjdth    schedule 22.02.2010
comment
Это был метод, который я использовал, но я собираюсь отметить другой ответ как правильный, потому что он тоже работает. - person mjdth; 24.02.2010