2010-02-22 92 views
2

我正在使用套接字并试图简单地将一个字符串写入套接字。我找到了几个关于如何做到这一点的例子,比如下面的例子(oStream是NSOutputStream)。这全都在NSStreamEventHasSpaceAvailable之内。将NSString放入uint8_t缓冲区

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行的警告:“传递getBytes的第5个参数使得指针中的整数不经过转换。”

对不起,如果这之前已经问过,找不到答案,它看起来像问题应该是非常简单的修复。谢谢!

编辑: 我发现了一些似乎工作,但我不知道它是否正确编程这样的事情。请参阅下面的答案。这种情况下使用的危险代码是?

+0

参数5的事情是关于'options'应该是一个整数(实际上是'NSStringEncodingConversionOptions'枚举的成员,或者这个枚举成员的组合),并且你传递NULL,它扩展成'(void *) 0'。通过零来关闭警告。 (虽然这不会解决您的问题。) – zneak 2010-02-22 23:32:17

+0

谢谢zneak。这摆脱了警告,但正如你所说没有解决实际问题。这是一个进步,虽然:) – mjdth 2010-02-22 23:52:54

回答

3
+0

这是因为你不能在C中设置一个动态数组大小,除了它的特定规则,Objective-C在C规则下工作。这就是说,cStringUsingEncoding不需要你创建一个数组。它返回一个'const char *',所以你需要声明一个'const char *'来接收结果:'const char * buffer = [strId cStringUsingEncoding:NSASCIIStringEncoding];' 然后你可以使用它作为数组(除非你不能使用'sizeof')。 – zneak 2010-02-23 00:01:09

3

进一步的研究之后,我发现,这似乎工作:

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

我觉得如果因为它是用一对夫妇的获取数据到NSOutputStream不同的方式,这不是很安全,以及长度。这样做会出现问题吗?

+0

这是我最终使用的方法,但我打算将另一个标记为正确的答案,因为它也适用。 – mjdth 2010-02-24 04:23:27