2016-05-12 32 views
-1

从rs232设备的文本视图中附加了一个sting。所有东西都会导入,但是有一些字符串会被concatinated,就好像附加了一个空值来结束并导入一些数据。任何想法如何在字符串中查找空值?从rs232导入的字符串中包含空值

- (void)readBytesAvailable:(NSInteger)count { 
    DataSource *sharedManager = [DataSource sharedManager]; 
    const int bufferLength = 1024; 
    uint8_t buffer[bufferLength]; 
    NSString *s; 

    NSInteger bytesRead = [session read:buffer bufferLength:bufferLength]; 
    if (bytesRead > 0) { 
     // Convert to a string - note that the remote device is sending only well- formed UTF8 text data (e.g. no binary data, no VT100 excampe codes, etc). 
     s = [[NSString alloc] initWithBytes:buffer length:bytesRead encoding: NSUTF8StringEncoding]; 

     AllDataTextView.text = [AllDataTextView.text stringByAppendingString:s]; 
+0

解决的课题:数据是ASCII格式,而不是UTF-8和缓冲区的长度是由发送到该方法计数设置。 – Wilbe

回答

0

你解析字符串的方式是错误的。

如果您正在以1024字节的块读取字节,那么您可以轻松读取某些字符的部分内容(UTF8字符的长度可以是1,2,3或甚至更多字节)。然后当试图解析这样的块时,您将得到nilnull),因为您的buffer将不包含有效数据(部分字符无效并且会导致解析失败)。

理想的解决方案是先读取所有字节,然后将它们转换为文本。另一种解决方案是检测部分字符(请参阅UTF8规范),并仅解析整个字符,并将部分字符保留在缓冲区中,直到下一次迭代。

Decoding partial UTF-8 into NSString参见

+0

你能给我一个如何读取所有字节然后将其转换为字符串的例子。感谢fot的信息,但我不是很知道这一点,因为我发布的一些代码来自我用来通过wifi下载数据的sdk。在此先感谢 – Wilbe

+0

@Wilbe我不确定这是否是您的选择,这取决于您的'会议'如何工作。 – Sulthan

+0

我看了一下,以确定会议类的工作原理,但似乎是从SDK的一部分库中拉出。我会联系SDK的开发者,也许他们可以在这个问题上发现一些问题。 – Wilbe