Выходной поток байтов сокета 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...)