Выходной поток байтов сокета ios

Я нахожу этот код на веб-сайте и переписываю его в свой текущий код, я могу успешно подключиться к серверной части. Но у меня все еще были некоторые проблемы:

OutputStream:

Согласно коду на сайте, я обычно могу отправить строку

- (IBAction)sendCmd:(id)sender
{
    NSString *response  = @"Hello World!";
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
    [outputStream write:[data bytes] maxLength:[data length]];
}

Но я хочу отправить байты (например, 0x80,0x10,0x20... и т.д.). Синтаксис Android:

         byte[] buf=new byte[10];
                buf[0]=(byte) 0x80;  
                buf[1]=(byte) 0x10; 
                buf[2]=(byte) 0x20;  

Но заменил IOS, я не знаю, как это сделать? Дайте мне несколько советов или сайт, благодарен.

1 ответ

Решение

Когда вы говорите "у меня есть байты", это, вероятно, означает либо:

  • У вас есть NSData или подобный тип, содержащий байты. Вы можете увидеть, как получить байты и длину для этого из вашего существующего примера - просто пропустите часть, где вы кодируете NSString для NSData потому что у вас уже есть NSData,

  • У вас есть необработанный буфер C (через void * или же char * или же unsigned char * или аналогичный) и длина. Это именно то, что -[NSOutputStream write: maxLength:] хочет от тебя; где проходит ваш пример [data bytes] а также [data length] Просто передайте указатель (возможно, с приведением) и значения длины.

Например:

const char msg[] = "\x80\x10\x20";
const NSUInteger msglen = sizeof(msg) / sizeof(*msg);
[outputStream write:(const uint8_t *)msg maxLength:msglen];

Если вы действительно хотите точный ObjC-эквивалент вашего кода Android по какой-то странной причине, он будет выглядеть примерно так:

NSMutableData *data = [NSMutableData dataWithLength:10];
uint8_t *buf = (uint8_t *)[data mutableBytes];
buf[0]=(uint8_t)0x80;
buf[1]=(uint8_t)0x10;
buf[2]=(uint8_t)0x20;
[outputStream write:buf maxLength:3]; // or is that 10?

Я не уверен, почему вы создаете 10-байтовый буфер и заполняете только 3 байта, но +dataWithLength делает то же самое, что и Android Java, и оставляет 7 других слотов заполненными нулями, если вы этого хотите.

(Вы также можете просто использовать calloc и пропустить все вещи ObjC, если вы хотите, но тогда вам придется иметь дело с проверкой NULL звонит free в конце, даже если где-то произошла ошибка и т. д., потому что C не Java...)

Другие вопросы по тегам