-2

我在网站上找到这些代码,并将其重写为我现在的代码,我可以成功连接到服务器端。但我仍然遇到一些问题:

输出流:

根据网站上的代码,我可以正常发送字符串

- (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,不知道怎么办?给我一些建议或网站,感激不尽。

4

1 回答 1

0

当您说“我有字节”时,这可能意味着:

  • 您有一个NSData或类似的类型来保存字节。您可以从现有示例中了解如何获取字节和长度 - 只需跳过将 编码为 的部分NSStringNSData因为您已经有了NSData.

  • 您有一个原始 C 缓冲区(通过 a void *or char *or or or unsigned char *or similar)和一个长度。这正是你想要的;您的示例在哪里通过and ,只需传递您的指针(可能带有强制转换)和长度值。-[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调用等等,因为 C 不是 Java……)free

于 2015-04-11T00:38:31.577 回答