首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过NSOutputStream发送整数?

如何通过NSOutputStream发送整数?
EN

Stack Overflow用户
提问于 2011-06-26 01:09:04
回答 1查看 972关注 0票数 3

所以我做了一个iOS应用程序,不断地通过NSStream发送和点数组,但因为有时发送方在接收方收到一个数组之前写入两个数组,我决定首先写入长度,然后写入数组数据本身,这样接收方就知道要处理多少字节。

发件人:

代码语言:javascript
复制
if (_outStream && [_outStream hasSpaceAvailable]){
    const uint8_t *buffer = [data bytes];
    uint64_t length = CFSwapInt64HostToLittle([data length]);
    NSLog(@"Sending bytes with length: %llu", length);
    int er1 = [_outStream write:(const uint8_t *)&length maxLength:sizeof(length)];
    int er2 = [_outStream write:buffer maxLength:length];  
    if (er1 < 0 || er2 < 0) {
        [self _showAlert:@"Failed sending data to peer"];
    }
}

接收者:

代码语言:javascript
复制
case NSStreamEventHasBytesAvailable:
    {
        if (stream == _inStream) {
            uint8_t *b;
            int len = 0;
            len = [_inStream read:b maxLength:8];
            uint64_t dataLength = CFSwapInt64LittleToHost(*b);
            NSLog(@"Received bytes with length: %llu", dataLength);
            if(len < 0) {
                if ([stream streamStatus] != NSStreamStatusAtEnd)
                    [self _showAlert:@"Failed reading data from peer"];
            } else if (len > 0){
                uint8_t bytes[dataLength];
                int length = [_inStream read:bytes maxLength:dataLength];

                [currentDownload appendBytes:bytes length:length]; 
                 id pointsArray = [NSKeyedUnarchiver unarchiveObjectWithData:currentDownload];
                [currentDownload release];
                currentDownload = [[NSMutableData alloc] init];
                if ([pointsArray isKindOfClass:[NSArray class]]) {
                    [drawScene addNewPoint:[[pointsArray objectAtIndex:0] CGPointValue] previousPoint:[[pointsArray objectAtIndex:1] CGPointValue]];
                }

            }
        }
        break;
    }

问题是接收器接收的整数不正确,因此它读取的字节数不正确。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-26 04:13:03

当您读取数据时,是否会从旨在传达长度的介绍性比特开始,而不是从实际数据开始?

适用于:

代码语言:javascript
复制
[currentDownload appendBytes:bytes length:length];

尝试替换如下所示的内容:

代码语言:javascript
复制
NSRange rangeLeftover = NSMakeRange(sizeof(uint8_t), [currentDownload length] - sizeof(uint8_t));
NSData *dataLeftover = [currentDownload subdataWithRange:rangeLeftover];
uint8_t bytesLeftover[[dataLeftover length]];
[dataLeftover getBytes:&bytesLeftover length:[dataLeftover length]];
currentDownload = [NSMutableData data]; // clear
[currentDownload appendBytes:bytesLeftover length:[dataLeftover length]];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6479290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档