ios 套接字输出流字节
ios socket outputstream bytes
我在website上找到这些代码,并改写成我现在的代码
,我可以成功连接到服务器side.But我还有一些问题:
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,不知道怎么办?
给点建议或者网址,感激不尽
当您说 "I have bytes" 时,大概意味着:
您有一个 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];
如果出于某些奇怪的原因,你真的想要一个与你的 Android 代码完全相同的 ObjC,它看起来像这样:
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 个位置用 0 填充,如果这是你想要的。
(您也可以只使用 calloc
并根据需要跳过所有 ObjC 内容,但是您必须处理检查 NULL
,最后调用 free
即使某处出现错误等,因为 C 不是 Java…)
我在website上找到这些代码,并改写成我现在的代码 ,我可以成功连接到服务器side.But我还有一些问题:
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,不知道怎么办? 给点建议或者网址,感激不尽
当您说 "I have bytes" 时,大概意味着:
您有一个
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];
如果出于某些奇怪的原因,你真的想要一个与你的 Android 代码完全相同的 ObjC,它看起来像这样:
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 个位置用 0 填充,如果这是你想要的。
(您也可以只使用 calloc
并根据需要跳过所有 ObjC 内容,但是您必须处理检查 NULL
,最后调用 free
即使某处出现错误等,因为 C 不是 Java…)