Iphone 如何通过NSOutputStream发送整数?

Iphone 如何通过NSOutputStream发送整数?,iphone,objective-c,nsstream,Iphone,Objective C,Nsstream,因此,我正在制作一个iOS应用程序,它通过NSStreams不断发送和排列点,但由于有时发送方在接收方收到一个数组之前写入两个数组,因此我决定先写入长度,然后写入数组数据本身,以便接收方知道要处理多少字节 发件人: if (_outStream && [_outStream hasSpaceAvailable]){ const uint8_t *buffer = [data bytes]; uint64_t length = CFSwapInt64HostToLi

因此,我正在制作一个iOS应用程序,它通过
NSStream
s不断发送和排列点,但由于有时发送方在接收方收到一个数组之前写入两个数组,因此我决定先写入长度,然后写入数组数据本身,以便接收方知道要处理多少字节

发件人:

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"];
    }
}
if(_-outStream&&[_-outStream-hasSpaceAvailable]){
const uint8_t*缓冲区=[数据字节];
uint64_t长度=CFSwapInt64HostToLittle([数据长度]);
NSLog(@“发送长度为:%llu的字节”,长度);
INTER1=[[u超出流写入:(const uint8_t*)和length maxLength:sizeof(length)];
INTER2=[[超出流写入:缓冲区最大长度:长度];
如果(er1<0 | | er2<0){
[self_showAlert:@“向对等方发送数据失败”];
}
}
接收人:

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;
    }
案例NSTRAVENTHSBYTESAVAILable:
{
如果(流==_流入){
uint8_t*b;
int len=0;
len=[[流内读取:b最大长度:8];
uint64_t数据长度=CFSwapInt64LittleToHost(*b);
NSLog(@“接收的字节长度为:%llu”,数据长度);
if(len<0){
如果([streamStatus]!=NSStreamStatusEnd)
[self_showAlert:@“无法从对等方读取数据”];
}否则如果(len>0){
uint8_t字节[数据长度];
int-length=[[流内读取:字节maxLength:dataLength];
[currentDownload appendBytes:字节长度:长度];
id pointsArray=[NSKeyedUnarchiver unarchiveObjectWithData:currentDownload];
[当前下载版本];
currentDownload=[[NSMutableData alloc]init];
if([pointsArray是类的种类:[NSArray类]]){
[drawScene addNewPoint:[[pointsArray objectAtIndex:0]CGPointValue]上一个点:[[pointsArray objectAtIndex:1]CGPointValue];
}
}
}
打破
}
问题是接收器接收到的整数不正确,因此读取的字节量不正确


有人能帮我吗?

是不是当你阅读数据时,你是从用来传达长度的介绍性位开始,而不是从实际数据开始

用于:

尝试替换如下内容:

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]];

不,不是那样的。我正在检查发送的整数和传入的整数。但是你要发送两组不同的信息:一个int表示答案的长度,后面是int(或int),这是答案本身。如果从输入的第0位开始检索应答数据,实际上是将引入的“长度”位作为“应答”int位的一部分,结果将是不匹配的。一个很好的测试是发送一个简单的答案1。我明白你的意思,但这不是手头的问题。发送的第一个int也是误读的。如果我能修好的话。我可以很容易地使用它在以后开始读取字节(如果有必要的话)。哦,“不正确的整数”实际上就是长度。你能告诉我们长度应该是多少以及实际阅读的内容是什么吗?这可能会提供线索。长度是否超过8位?不,发送的长度为388,接收的int显示137。
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]];